diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h
index 232478577c79e2d24a21152dfd7357fe87b0f27b..40e4a4268d1207a11be0d1eaffc0524baf50dd96 100644
--- a/indra/llmessage/llregionflags.h
+++ b/indra/llmessage/llregionflags.h
@@ -92,7 +92,7 @@ const U32 REGION_FLAGS_DENY_ANONYMOUS			= (1 << 23);
 
 const U32 REGION_FLAGS_ALLOW_PARCEL_CHANGES		= (1 << 26);
 
-const U32 REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER = (1 << 27);
+// const U32 REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER = (1 << 27); // We no longer support ELAR
 
 const U32 REGION_FLAGS_ALLOW_VOICE = (1 << 28);
 
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 70d770ef7ed6d99cdafd183b9198f8cef051f95f..1a382643da537121f296fcde94daf84a9f4962de 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -63,14 +63,15 @@ LLPluginClassMedia::~LLPluginClassMedia()
 	reset();
 }
 
-bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
+bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
 {	
 	LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;
 	LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL;
+	LL_DEBUGS("Plugin") << "user_data_path: " << user_data_path << LL_ENDL;
 	
 	mPlugin = new LLPluginProcessParent(this);
 	mPlugin->setSleepTime(mSleepTime);
-	mPlugin->init(launcher_filename, plugin_filename, debug);
+	mPlugin->init(launcher_filename, plugin_filename, debug, user_data_path);
 
 	return true;
 }
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 6b6468871841a88e8353b91b4fc40f439534ae3b..b58067733b5f9022aadad61f12c5a0c7fea749bc 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -49,7 +49,7 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner
 	virtual ~LLPluginClassMedia();
 
 	// local initialization, called by the media manager when creating a source
-	virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false);
+	virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
 
 	// undoes everything init() didm called by the media manager when destroying a source
 	virtual void reset();
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index 55cf11c6208805cca7e72d15ea28c4ec4c13d2f2..ccf6dab942a1bdb1d28a897ad1feb4f4bf1257fc 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -145,8 +145,12 @@ void LLPluginProcessChild::idle(void)
 			break;
 			
 			case STATE_PLUGIN_LOADED:
-				setState(STATE_PLUGIN_INITIALIZING);
-				sendMessageToPlugin(LLPluginMessage("base", "init"));
+				{
+					setState(STATE_PLUGIN_INITIALIZING);
+					LLPluginMessage message("base", "init");
+					message.setValue("user_data_path", mUserDataPath);
+					sendMessageToPlugin(message);
+				}
 			break;
 			
 			case STATE_PLUGIN_INITIALIZING:
@@ -310,6 +314,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
 			if(message_name == "load_plugin")
 			{
 				mPluginFile = parsed.getValue("file");
+				mUserDataPath = parsed.getValue("user_data_path");
 			}
 			else if(message_name == "shm_add")
 			{
diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h
index f5c57c3d49d212257723d33a208e3d15bd8ddf22..1cfd9dcaf9a411f1d635ec484c51d00f0225414c 100644
--- a/indra/llplugin/llpluginprocesschild.h
+++ b/indra/llplugin/llpluginprocesschild.h
@@ -96,6 +96,8 @@ class LLPluginProcessChild: public LLPluginMessagePipeOwner, public LLPluginInst
 	LLSocket::ptr_t mSocket;
 	
 	std::string mPluginFile;
+
+	std::string mUserDataPath;
 	
 	LLPluginInstance *mInstance;
 
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 332ce288d70207292d2ef16ed3ce7c0e331799b9..f60838b1e733c83d6637f288a0f80c2195649da7 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -99,12 +99,13 @@ void LLPluginProcessParent::errorState(void)
 		setState(STATE_ERROR);
 }
 
-void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
+void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
 {	
 	mProcess.setExecutable(launcher_filename);
 	mPluginFile = plugin_filename;
 	mCPUUsage = 0.0f;
 	mDebug = debug;
+	mUserDataPath = user_data_path;
 	
 	setState(STATE_INITIALIZED);
 }
@@ -362,6 +363,7 @@ void LLPluginProcessParent::idle(void)
 				{
 					LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin");
 					message.setValue("file", mPluginFile);
+					message.setValue("user_data_path", mUserDataPath);
 					sendMessage(message);
 				}
 
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 25669f5d78eddb2d9a100809bb5558b30bee8a89..6d661a69601b852fe27293d58c59f7bebb5dabdc 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -58,7 +58,7 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner
 	LLPluginProcessParent(LLPluginProcessParentOwner *owner);
 	~LLPluginProcessParent();
 		
-	void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false);
+	void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
 	void idle(void);
 	
 	// returns true if the plugin is on its way to steady state
@@ -139,6 +139,8 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner
 	
 	std::string mPluginFile;
 
+	std::string mUserDataPath;
+
 	LLPluginProcessParentOwner *mOwner;
 	
 	typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType;
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 46491d8a29e9743bca40046254a26f217e7c070d..2c339f4a3f508ef10975f5fdf43a5144dc8c392a 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -83,6 +83,8 @@ class LLDockableFloater : public LLFloater
 	virtual void onDockHidden();
 	virtual void onDockShown();
 
+	LLDockControl* getDockControl();
+
 private:
 	/**
 	 * Provides unique of dockable floater.
@@ -92,7 +94,6 @@ class LLDockableFloater : public LLFloater
 
 protected:
 	void setDockControl(LLDockControl* dockControl);
-	LLDockControl* getDockControl();
 	const LLUIImagePtr& getDockTongue();
 
 private:
diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h
index 30a45bedc74e43f3225fe9dfb404e6440fadc8a0..550955c4c537484ad5a0db3c44e2bd25bfb78749 100644
--- a/indra/llui/lldockcontrol.h
+++ b/indra/llui/lldockcontrol.h
@@ -76,6 +76,9 @@ class LLDockControl
 	// gets a rect that bounds possible positions for a dockable control (EXT-1111)
 	void getAllowedRect(LLRect& rect);
 
+	S32 getTongueWidth() { return mDockTongue->getWidth(); }
+	S32 getTongueHeight() { return mDockTongue->getHeight(); }
+
 private:
 	virtual void moveDockable();
 private:
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 831ac66d061f1ecaf0a28d5fa784023a55768b3f..64a4824a17d2cc53020c3275ecadecce682aee26 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -891,7 +891,13 @@ void LLFlatListView::setNoItemsCommentVisible(bool visible) const
 			// We have to update child rect here because of issues with rect after reshaping while creating LLTextbox
 			// It is possible to have invalid LLRect if Flat List is in LLAccordionTab
 			LLRect comment_rect = getLocalRect();
-			comment_rect.stretch(-getBorderWidth());
+
+			// To see comment correctly (EXT - 3244) in mNoItemsCommentTextbox we must get border width
+			// of LLFlatListView (@see getBorderWidth()) and stretch mNoItemsCommentTextbox to this width
+			// But getBorderWidth() returns 0 if LLFlatListView not visible. So we have to get border width
+			// from 'scroll_border'
+			LLViewBorder* scroll_border = getChild<LLViewBorder>("scroll border");
+			comment_rect.stretch(-scroll_border->getBorderWidth());
 			mNoItemsCommentTextbox->setRect(comment_rect);
 		}
 		mNoItemsCommentTextbox->setVisible(visible);
diff --git a/indra/llui/llhelp.h b/indra/llui/llhelp.h
index 82c3bc385f322434a033b356f1ea94fd8a0214cf..938419d374d6b6e0e802d4a0aeaa0244b19cf713 100644
--- a/indra/llui/llhelp.h
+++ b/indra/llui/llhelp.h
@@ -42,6 +42,8 @@ class LLHelp
 	virtual std::string defaultTopic() = 0;
 	// return topic to use before the user logs in
 	virtual std::string preLoginTopic() = 0;
+	// return topic to use for the top-level help, invoked by F1
+	virtual std::string f1HelpTopic() = 0;
 };
 
 #endif // headerguard
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 907f2352a034453453cef1a67aee2e3bc3543ce7..fd5c2b7fefc0f6068615529939cdc16b6e38b8b4 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -761,7 +761,7 @@ void LLMenuItemCallGL::initFromParams(const Params& p)
 {
 	if (p.on_visible.isProvided())
 	{
-		mVisibleSignal.connect(initVisibleCallback(p.on_visible));
+		mVisibleSignal.connect(initEnableCallback(p.on_visible));
 	}
 	if (p.on_enable.isProvided())
 	{
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index cbb9b4d3448a105d588af9fdf3de3924507a814f..61e06f9e5f971ce47da5ff1b7859add610afead4 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -175,9 +175,7 @@ class LLMenuItemGL : public LLUICtrl
 	// This function appends the character string representation of
 	// the current accelerator key and mask to the provided string.
 	void appendAcceleratorString( std::string& st ) const;
-	
-	void initMenuEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig);
-	
+		
 protected:
 	KEY mAcceleratorKey;
 	MASK mAcceleratorMask;
@@ -249,7 +247,7 @@ class LLMenuItemCallGL : public LLMenuItemGL
 	{
 		Optional<EnableCallbackParam > on_enable;
 		Optional<CommitCallbackParam > on_click;
-		Optional<VisibleCallbackParam > on_visible;
+		Optional<EnableCallbackParam > on_visible;
 		Params()
 			: on_enable("on_enable"),
 			  on_click("on_click"),
@@ -284,15 +282,10 @@ class LLMenuItemCallGL : public LLMenuItemGL
 	{
 		return mEnableSignal.connect(cb);
 	}
-	
-	boost::signals2::connection setVisibleCallback( const visible_signal_t::slot_type& cb )
-	{
-		return mVisibleSignal.connect(cb);
-	}
-	
+		
 private:
 	enable_signal_t mEnableSignal;
-	visible_signal_t mVisibleSignal;
+	enable_signal_t mVisibleSignal;
 };
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index a8bd5fd5e549db3a633ee1f0b30a5de05d6cc37c..d0986a06d396396f455234a335bb4d75fae2165f 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -249,7 +249,6 @@ class LLPanel : public LLUICtrl
 	LLCallbackMap::map_t mFactoryMap;
 	CommitCallbackRegistry::ScopedRegistrar mCommitCallbackRegistrar;
 	EnableCallbackRegistry::ScopedRegistrar mEnableCallbackRegistrar;
-	VisibleCallbackRegistry::ScopedRegistrar mVisibleCallbackRegistrar;
 
 	commit_signal_t* mVisibleSignal;		// Called when visibility changes, passes new visibility as LLSD()
 
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 2a9515171a57dd36fbfd54ee48ea1ec75f4f0843..e0503a084470bf3c3597bcc49d08a26ddda2da12 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2080,6 +2080,8 @@ void LLTextBase::updateRects()
 		}
 
 		mContentsRect.mTop += mVPad;
+		// subtract a pixel off the bottom to deal with rounding errors in measuring font height
+		mContentsRect.mBottom -= 1;
 
 		S32 delta_pos = -mContentsRect.mBottom;
 		// move line segments to fit new document rect
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index e68affc36c605cd9f125518d93c7c69a1aa483c8..faf9ccbeb86afd24f5b8fde26cc272d3fa64e79c 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -1887,9 +1887,10 @@ void LLTextEditor::doDelete()
 			removeChar();
 		}
 
-		onKeyStroke();
 	}
 
+	onKeyStroke();
+
 	needsReflow();
 }
 
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 706712ec5e703f3431992b230539618403cfbc0f..6044908ca797b4ab48d3153b42d6b925f164deeb 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -232,11 +232,6 @@ bool default_enable_handler(LLUICtrl* ctrl, const LLSD& param)
 	return true;
 }
 
-bool default_visible_handler(LLUICtrl* ctrl, const LLSD& param)
-{
-	return true;
-}
-
 
 LLUICtrl::commit_signal_t::slot_type LLUICtrl::initCommitCallback(const CommitCallbackParam& cb)
 {
@@ -290,30 +285,6 @@ LLUICtrl::enable_signal_t::slot_type LLUICtrl::initEnableCallback(const EnableCa
 	return default_enable_handler;
 }
 
-LLUICtrl::visible_signal_t::slot_type LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb)
-{
-	// Set the callback function
-	if (cb.function.isProvided())
-	{
-		if (cb.parameter.isProvided())
-			return boost::bind(cb.function(), this, cb.parameter);
-		else
-			return cb.function();
-	}
-	else
-	{
-		visible_callback_t* func = (VisibleCallbackRegistry::getValue(cb.function_name));
-		if (func)
-		{
-			if (cb.parameter.isProvided())
-				return boost::bind((*func), this, cb.parameter);
-			else
-				return visible_signal_t::slot_type(*func);
-		}
-	}
-	return default_visible_handler;
-}
-
 // virtual
 void LLUICtrl::onMouseEnter(S32 x, S32 y, MASK mask)
 {
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index b20ff5d798c0ae49b5d8e06e1d861367b2757393..b9a4f61e15a34778c421fef4fd366adbefbcebc2 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -63,9 +63,6 @@ class LLUICtrl
 	typedef boost::function<bool (LLUICtrl* ctrl, const LLSD& param)> enable_callback_t;
 	typedef boost::signals2::signal<bool (LLUICtrl* ctrl, const LLSD& param), boost_boolean_combiner> enable_signal_t;
 	
-	typedef boost::function<bool (LLUICtrl* ctrl, const LLSD& param)> visible_callback_t;
-	typedef boost::signals2::signal<bool (LLUICtrl* ctrl, const LLSD& param), boost_boolean_combiner> visible_signal_t;
-	
 	struct CallbackParam : public LLInitParam::Block<CallbackParam>
 	{
 		Ignored					name;
@@ -83,16 +80,12 @@ class LLUICtrl
 		Optional<commit_callback_t> function;
 	};
 
+	// also used for visible callbacks
 	struct EnableCallbackParam : public LLInitParam::Block<EnableCallbackParam, CallbackParam >
 	{
 		Optional<enable_callback_t> function;
 	};
-	
-	struct VisibleCallbackParam : public LLInitParam::Block<VisibleCallbackParam, CallbackParam >
-	{
-		Optional<visible_callback_t> function;
-	};
-	
+		
 	struct EnableControls : public LLInitParam::Choice<EnableControls>
 	{
 		Alternative<std::string> enabled;
@@ -148,7 +141,6 @@ class LLUICtrl
 	
 	commit_signal_t::slot_type initCommitCallback(const CommitCallbackParam& cb);
 	enable_signal_t::slot_type initEnableCallback(const EnableCallbackParam& cb);
-	visible_signal_t::slot_type initVisibleCallback(const VisibleCallbackParam& cb);
 
 	// We need this virtual so we can override it with derived versions
 	virtual LLViewModel* getViewModel() const;
@@ -269,10 +261,9 @@ class LLUICtrl
 	{};	
 
 	class CommitCallbackRegistry : public CallbackRegistry<commit_callback_t, CommitCallbackRegistry>{};
+	// the enable callback registry is also used for visiblity callbacks
 	class EnableCallbackRegistry : public CallbackRegistry<enable_callback_t, EnableCallbackRegistry>{};
-	class VisibleCallbackRegistry : public CallbackRegistry<visible_callback_t, VisibleCallbackRegistry>{};
-
-	
+		
 protected:
 
 	static bool controlListener(const LLSD& newvalue, LLHandle<LLUICtrl> handle, std::string type);
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 7694d0283711dc2fe51fda331c35694b9b264ebe..73504572749378ef53d0edb5298cfadcfb209e4f 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -196,6 +196,31 @@ std::string LLUrlEntryHTTPLabel::getUrl(const std::string &string)
 	return getUrlFromWikiLink(string);
 }
 
+//
+// LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com
+//
+LLUrlEntryHTTPNoProtocol::LLUrlEntryHTTPNoProtocol()
+{
+	mPattern = boost::regex("(\\bwww\\.\\S+\\.\\S+|\\S+.com\\S*|\\S+.net\\S*|\\S+.edu\\S*|\\S+.org\\S*)",
+							boost::regex::perl|boost::regex::icase);
+	mMenuName = "menu_url_http.xml";
+	mTooltip = LLTrans::getString("TooltipHttpUrl");
+}
+
+std::string LLUrlEntryHTTPNoProtocol::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+	return unescapeUrl(url);
+}
+
+std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string)
+{
+	if (string.find("://") == std::string::npos)
+	{
+		return "http://" + escapeUrl(string);
+	}
+	return escapeUrl(string);
+}
+
 //
 // LLUrlEntrySLURL Describes generic http: and https: Urls
 //
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index b3fb333fdd80f91c25fffdb9931a154c3bb6bbc6..4adffde99c35a9c47ab71166ddcbe603e18b6f9e 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -134,6 +134,17 @@ class LLUrlEntryHTTPLabel : public LLUrlEntryBase
 	/*virtual*/ std::string getUrl(const std::string &string);
 };
 
+///
+/// LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com
+///
+class LLUrlEntryHTTPNoProtocol : public LLUrlEntryBase
+{
+public:
+	LLUrlEntryHTTPNoProtocol();
+	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+	/*virtual*/ std::string getUrl(const std::string &string);
+};
+
 ///
 /// LLUrlEntrySLURL Describes http://slurl.com/... Urls
 ///
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index f47db2db1a5110d484525391873b2a0a696dda84..afcff0d4090c607ea729b0adddda94a6a4c8b526 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -58,6 +58,9 @@ LLUrlRegistry::LLUrlRegistry()
 	//so it should be registered in the end of list
 	registerUrl(new LLUrlEntrySL());
 	registerUrl(new LLUrlEntrySLLabel());
+	// most common pattern is a URL without any protocol,
+	// e.g., "secondlife.com"
+	registerUrl(new LLUrlEntryHTTPNoProtocol());	
 }
 
 LLUrlRegistry::~LLUrlRegistry()
@@ -118,10 +121,23 @@ static bool matchRegex(const char *text, boost::regex regex, U32 &start, U32 &en
 	return true;
 }
 
+static bool stringHasUrl(const std::string &text)
+{
+	// fast heuristic test for a URL in a string. This is used
+	// to avoid lots of costly regex calls, BUT it needs to be
+	// kept in sync with the LLUrlEntry regexes we support.
+	return (text.find("://") != std::string::npos ||
+			text.find("www.") != std::string::npos ||
+			text.find(".com") != std::string::npos ||
+			text.find(".net") != std::string::npos ||
+			text.find(".edu") != std::string::npos ||
+			text.find(".org") != std::string::npos);
+}
+
 bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb)
 {
 	// avoid costly regexes if there is clearly no URL in the text
-	if (text.find("://") == std::string::npos)
+	if (! stringHasUrl(text))
 	{
 		return false;
 	}
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index c0c6e592d584318a72d73059c7336509c2a0846c..b2b17fdd56583a7e71b5aef873a1478ec8f8c63a 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -394,12 +394,6 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
 		prefix += "local_assets";
 		break;
 
-	case LL_PATH_MOZILLA_PROFILE:
-		prefix = getOSUserAppDir();
-		prefix += mDirDelimiter;
-		prefix += "browser_profile";
-		break;
-
 	case LL_PATH_EXECUTABLE:
 		prefix = getExecutableDir();
 		break;
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index 07c814769ef1dc1ab50d115c1c91c7567e8cf44e..206e3223e3bdce1e097b1c9dce55fc053e1b4854 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -38,7 +38,7 @@
 #define MAX_PATH MAXPATHLEN
 #endif
 
-// these numbers *may* get serialized, so we need to be explicit
+// these numbers *may* get serialized (really??), so we need to be explicit
 typedef enum ELLPath
 {
 	LL_PATH_NONE = 0,
@@ -54,10 +54,8 @@ typedef enum ELLPath
 	LL_PATH_TOP_SKIN = 10,
 	LL_PATH_CHAT_LOGS = 11,
 	LL_PATH_PER_ACCOUNT_CHAT_LOGS = 12,
-	LL_PATH_MOZILLA_PROFILE = 13,
 	LL_PATH_USER_SKIN = 14,
 	LL_PATH_LOCAL_ASSETS = 15,
-//	LL_PATH_HTML = 16,
 	LL_PATH_EXECUTABLE = 16,
 	LL_PATH_DEFAULT_SKIN = 17,
 	LL_PATH_FONTS = 18,
diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp
index 08c993ed2aa42c57c1d1a18a3291261bc12c5502..ee902d1de791e3e245e1e16169a4569141230493 100644
--- a/indra/llvfs/lldir_linux.cpp
+++ b/indra/llvfs/lldir_linux.cpp
@@ -225,15 +225,6 @@ void LLDir_Linux::initAppDirs(const std::string &app_name,
 		}
 	}
 	
-	res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,""));
-	if (res == -1)
-	{
-		if (errno != EEXIST)
-		{
-			llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
-		}
-	}
-
 	mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
 }
 
diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp
index a21f3ca0abab877dd4173326edcf0c50d4380950..a8fad8e5bdf7b1fcad74a08138edf7ad6b46f10f 100644
--- a/indra/llvfs/lldir_solaris.cpp
+++ b/indra/llvfs/lldir_solaris.cpp
@@ -244,15 +244,6 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name,
 		}
 	}
 	
-	res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,""));
-	if (res == -1)
-	{
-		if (errno != EEXIST)
-		{
-			llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
-		}
-	}
-
 	mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
 }
 
diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp
index 4c376f11a5a0532d73f1815abf79286c2969acf4..4eb10c842be332ac35a0c3e235ad78f92e18bb0a 100644
--- a/indra/llvfs/lldir_win32.cpp
+++ b/indra/llvfs/lldir_win32.cpp
@@ -212,14 +212,6 @@ void LLDir_Win32::initAppDirs(const std::string &app_name,
 		}
 	}
 	
-	res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,""));
-	if (res == -1)
-	{
-		if (errno != EEXIST)
-		{
-			llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
-		}
-	}
 	res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SKIN,""));
 	if (res == -1)
 	{
diff --git a/indra/lscript/lscript_export.h b/indra/lscript/lscript_export.h
index d4626a8cd267c73b5bc4ad4ad99f4687bcacbee7..4c883582e244720cdf2b632486d941cc1f2a7119 100644
--- a/indra/lscript/lscript_export.h
+++ b/indra/lscript/lscript_export.h
@@ -35,6 +35,6 @@
 
 #include "lscript_library.h"
 
-extern LLScriptLibrary gScriptLibrary;
+
 
 #endif
diff --git a/indra/lscript/lscript_library.h b/indra/lscript/lscript_library.h
index 6728d70d0a7922b54768595862b7b887e9654fc3..363d11f3aac1a25dadccad04da9c50ff5c32e9d5 100644
--- a/indra/lscript/lscript_library.h
+++ b/indra/lscript/lscript_library.h
@@ -70,7 +70,7 @@ class LLScriptLibrary
 	std::vector<LLScriptLibraryFunction>	mFunctions;
 };
 
-extern LLScriptLibrary gScriptLibrary;
+
 
 class LLScriptLibData
 {
@@ -428,4 +428,6 @@ class LLScriptLibData
 
 };
 
+extern LLScriptLibrary gScriptLibrary;
+
 #endif
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 25f4c8720a9353f617359da697acbbca3a0577c4..276ad39dfbac89c19559192f98f520c360ab67d8 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -76,6 +76,8 @@ class MediaPluginWebKit :
 
 private:
 
+	std::string mProfileDir;
+
 	enum
 	{
 		INIT_STATE_UNINITIALIZED,		// Browser instance hasn't been set up yet
@@ -187,7 +189,6 @@ class MediaPluginWebKit :
 #else
 		std::string component_dir = application_dir;
 #endif
-		std::string profileDir = application_dir + "/" + "browser_profile";		// cross platform?
 
 		// window handle - needed on Windows and must be app window.
 #if LL_WINDOWS
@@ -199,7 +200,7 @@ class MediaPluginWebKit :
 #endif
 
 		// main browser initialization
-		bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, profileDir, native_window_handle );
+		bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, mProfileDir, native_window_handle );
 		if ( result )
 		{
 			// create single browser window
@@ -587,6 +588,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
 		{
 			if(message_name == "init")
 			{
+				std::string user_data_path = message_in.getValue("user_data_path"); // n.b. always has trailing platform-specific dir-delimiter
+				mProfileDir = user_data_path + "browser_profile";
+
 				LLPluginMessage message("base", "init_response");
 				LLSD versions = LLSD::emptyMap();
 				versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index be6bce8054f6c658f563bd205db6e33bdf799f12..72630cc413fbdf8b9bc3c661ccdd71fdcaf646e9 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -104,6 +104,7 @@ set(viewer_SOURCE_FILES
     llclassifiedstatsresponder.cpp
     llcloud.cpp
     llcolorswatch.cpp
+    llcommanddispatcherlistener.cpp
     llcommandhandler.cpp
     llcommandlineparser.cpp
     llcompilequeue.cpp
@@ -324,6 +325,7 @@ set(viewer_SOURCE_FILES
     llpanellandmarks.cpp
     llpanellandmedia.cpp
     llpanellogin.cpp
+    llpanelloginlistener.cpp
     llpanellookinfo.cpp
     llpanelmaininventory.cpp
     llpanelmediasettingsgeneral.cpp
@@ -444,6 +446,7 @@ set(viewer_SOURCE_FILES
     lluploaddialog.cpp
     llurl.cpp
     llurldispatcher.cpp
+    llurldispatcherlistener.cpp
     llurlhistory.cpp
     llurllineeditorctrl.cpp
     llurlsimstring.cpp
@@ -611,6 +614,7 @@ set(viewer_HEADER_FILES
     llclassifiedstatsresponder.h
     llcloud.h
     llcolorswatch.h
+    llcommanddispatcherlistener.h
     llcommandhandler.h
     llcommandlineparser.h
     llcompilequeue.h
@@ -826,6 +830,7 @@ set(viewer_HEADER_FILES
     llpanellandmarks.h
     llpanellandmedia.h
     llpanellogin.h
+    llpanelloginlistener.h
     llpanellookinfo.h
     llpanelmaininventory.h
     llpanelmediasettingsgeneral.h
@@ -950,6 +955,7 @@ set(viewer_HEADER_FILES
     lluploaddialog.h
     llurl.h
     llurldispatcher.h
+    llurldispatcherlistener.h
     llurlhistory.h
     llurllineeditorctrl.h
     llurlsimstring.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c43032a3cf84fd02bc8dc41031a9543a664aec9c..289e900eaff12dfcd59ba76ac89c2f1e8038f7db 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4974,7 +4974,6 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-    <key>StartUpToastLifeTime</key>
     <key>NearbyToastFadingTime</key>
     <map>
       <key>Comment</key>
@@ -5039,7 +5038,18 @@
       <key>Type</key>
       <string>S32</string>
       <key>Value</key>
-      <integer>35</integer>
+      <integer>5</integer>
+    </map>
+    <key>NotificationChannelHeightRatio</key>
+    <map>
+      <key>Comment</key>
+      <string>Notification channel and World View ratio(0.0 - always show 1 notification, 1.0 - max ratio).</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>F32</string>
+      <key>Value</key>
+      <real>0.5</real>
     </map>
     <key>OverflowToastHeight</key>
     <map>
@@ -9911,6 +9921,28 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>UseCircuitCodeMaxRetries</key>
+    <map>
+      <key>Comment</key>
+      <string>Max timeout count for the initial UseCircuitCode message</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <real>3</real>
+    </map>
+    <key>UseCircuitCodeTimeout</key>
+    <map>
+      <key>Comment</key>
+      <string>Timeout duration in seconds for the initial UseCircuitCode message</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>F32</string>
+      <key>Value</key>
+      <real>5.0</real>
+    </map>
     <key>UseDebugLogin</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index d7182dfaab2fd036bf59392490f8f5087f4a26ce..ae89eb4413579f36aa16560388f35653d7224a7d 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -9283,7 +9283,7 @@ render_pass="bump">
      wearable="skin"
      edit_group="skin_facedetail"
      edit_group_order="3"
-     name="wrinkles"
+     name="Wrinkles"
      label_min="Less"
      label_max="More"
      value_min="0"
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 508badcc6fa77691fe0e5389b893f145ca7f8ef3..9a1b749ba7f1d2084bc0d267d13858d13d811746 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -78,6 +78,8 @@
 #include "lllocationhistory.h"
 #include "llfasttimerview.h"
 #include "llvoicechannel.h"
+#include "llsidetray.h"
+
 
 #include "llweb.h"
 #include "llsecondlifeurls.h"
@@ -2854,6 +2856,8 @@ void LLAppViewer::requestQuit()
 		gFloaterView->closeAllChildren(true);
 	}
 
+	LLSideTray::getInstance()->notifyChildren(LLSD().with("request","quit"));
+
 	send_stats();
 
 	gLogoutTimer.reset();
@@ -3758,6 +3762,13 @@ void LLAppViewer::idleShutdown()
 	{
 		return;
 	}
+
+	if (LLSideTray::getInstance()->notifyChildren(LLSD().with("request","wait_quit")))
+	{
+		return;
+	}
+
+
 	
 	// ProductEngine: Try moving this code to where we shut down sTextureCache in cleanup()
 	// *TODO: ugly
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 5af023f5657de6853da13da6d102389a6260cead..5f90a7627f3727fef031b12fa58d868a4050dd96 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -62,9 +62,6 @@
 #include "llimfloater.h"
 #include "lltrans.h"
 
-// callback connection to auto-call when the IM floater initializes
-boost::signals2::connection gAdhocAutoCall;
-
 // static
 void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)
 {
@@ -250,8 +247,8 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
 	// always open IM window when connecting to voice
 	LLIMFloater::show(session_id);
 
-	// start the call once the floater has fully initialized
-	gAdhocAutoCall = LLIMModel::getInstance()->addSessionInitializedCallback(callbackAutoStartCall);
+	// start the call once the session has fully initialized
+	gIMMgr->autoStartCallOnStartup(session_id);
 
 	make_ui_sound("UISndStartIM");
 }
@@ -466,17 +463,6 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re
     return false;
 }
 
-// static
-void LLAvatarActions::callbackAutoStartCall(const LLSD& data)
-{
-	// start the adhoc voice call now the IM panel has initialized
-	LLUUID session_id = data["session_id"].asUUID();
-	gIMMgr->startCall(session_id);
-
-	// and deschedule this callback as its work is done now
-	gAdhocAutoCall.disconnect();
-}
-
 // static
 void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message)
 {
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 4c9851a48d4fde4a54b196534e3527ad3418ef48..2dd2a4c4b12b3fcc0dba969cce1040e6d3d1ded6 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -139,7 +139,6 @@ class LLAvatarActions
 	static bool handleRemove(const LLSD& notification, const LLSD& response);
 	static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id);
 	static void callback_invite_to_group(LLUUID group_id, LLUUID id);
-	static void callbackAutoStartCall(const LLSD& data);
 
 	// Just request friendship, no dialog.
 	static void requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message);
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 4b3b7a99d844fac9179ededc9e319b28eeaab34e..30967677e8630075509cf8de8b4ecf3d83d0c2ee 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -61,6 +61,7 @@ static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
 static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
 static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");
 static LLDefaultChildRegistry::Register<LLScriptChiclet> t6("chiclet_script");
+static LLDefaultChildRegistry::Register<LLInvOfferChiclet> t7("chiclet_offer");
 
 static const LLRect CHICLET_RECT(0, 25, 25, 0);
 static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
@@ -78,29 +79,73 @@ boost::signals2::signal<LLChiclet* (const LLUUID&),
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
+/**
+ * Updates the Well's 'Lit' state to flash it when "new messages" are come.
+ *
+ * It gets callback which will be called 2*N times with passed period. See EXT-3147
+ */
+class LLSysWellChiclet::FlashToLitTimer : public LLEventTimer
+{
+public:
+	typedef boost::function<void()> callback_t;
+	FlashToLitTimer(S32 count, F32 period, callback_t cb)
+		: LLEventTimer(period)
+		, mCallback(cb)
+		, mFlashCount(2 * count)
+		, mCurrentFlashCount(0)
+	{
+		mEventTimer.stop();
+	}
+
+	BOOL tick()
+	{
+		mCallback();
+
+		if (++mCurrentFlashCount == mFlashCount) mEventTimer.stop();
+		return FALSE;
+	}
+
+	void flash()
+	{
+		mCurrentFlashCount = 0;
+		mEventTimer.start();
+	}
+
+private:
+	callback_t		mCallback;
+	S32 mFlashCount;
+	S32 mCurrentFlashCount;
+};
+
 LLSysWellChiclet::Params::Params()
 : button("button")
 , unread_notifications("unread_notifications")
+, max_displayed_count("max_displayed_count", 9)
+, flash_to_lit_count("flash_to_lit_count", 3)
+, flash_period("flash_period", 0.5F)
 {
 	button.name("button");
 	button.tab_stop(FALSE);
 	button.label(LLStringUtil::null);
-
 }
 
 LLSysWellChiclet::LLSysWellChiclet(const Params& p)
 : LLChiclet(p)
 , mButton(NULL)
 , mCounter(0)
+, mMaxDisplayedCount(p.max_displayed_count)
+, mFlashToLitTimer(NULL)
 {
 	LLButton::Params button_params = p.button;
 	mButton = LLUICtrlFactory::create<LLButton>(button_params);
 	addChild(mButton);
+
+	mFlashToLitTimer = new FlashToLitTimer(p.flash_to_lit_count, p.flash_period, boost::bind(&LLSysWellChiclet::changeLitState, this));
 }
 
 LLSysWellChiclet::~LLSysWellChiclet()
 {
-
+	delete mFlashToLitTimer;
 }
 
 void LLSysWellChiclet::setCounter(S32 counter)
@@ -108,11 +153,30 @@ void LLSysWellChiclet::setCounter(S32 counter)
 	std::string s_count;
 	if(counter != 0)
 	{
-		s_count = llformat("%d", counter);
+		static std::string more_messages_exist("+");
+		std::string more_messages(counter > mMaxDisplayedCount ? more_messages_exist : "");
+		s_count = llformat("%d%s"
+			, llmin(counter, mMaxDisplayedCount)
+			, more_messages.c_str()
+			);
 	}
 
 	mButton->setLabel(s_count);
 
+	/*
+	Emulate 4 states of button by background images, see detains in EXT-3147
+	xml attribute           Description
+	image_unselected        "Unlit" - there are no new messages
+	image_selected          "Unlit" + "Selected" - there are no new messages and the Well is open
+	image_pressed           "Lit" - there are new messages
+	image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well is open
+	*/
+	mButton->setForcePressedState(counter > 0);
+
+	if (mCounter == 0 && counter > 0)
+	{
+		mFlashToLitTimer->flash();
+	}
 	mCounter = counter;
 }
 
@@ -126,6 +190,14 @@ void LLSysWellChiclet::setToggleState(BOOL toggled) {
 	mButton->setToggleState(toggled);
 }
 
+void LLSysWellChiclet::changeLitState()
+{
+	static bool set_lit = false;
+
+	mButton->setForcePressedState(set_lit);
+
+	set_lit ^= true;
+}
 
 /************************************************************************/
 /*               LLIMWellChiclet implementation                         */
@@ -939,12 +1011,34 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
 	}
 }
 
+void object_chiclet_callback(const LLSD& data)
+{
+	LLUUID object_id = data["object_id"];
+	bool new_message = data["new_message"];
+
+	std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(object_id);
+	std::list<LLChiclet *>::iterator iter;
+	for (iter = chiclets.begin(); iter != chiclets.end(); iter++)
+	{
+		LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*iter);
+		if (chiclet != NULL)
+		{
+			if(data.has("unread"))
+			{
+				chiclet->setCounter(data["unread"]);
+			}
+			chiclet->setShowNewMessagesIcon(new_message);
+		}
+	}
+}
 
 BOOL LLChicletPanel::postBuild()
 {
 	LLPanel::postBuild();
 	LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1));
 	LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1));
+	LLScriptFloaterManager::getInstance()->addNewObjectCallback(boost::bind(object_chiclet_callback, _1));
+	LLScriptFloaterManager::getInstance()->addToggleObjectFloaterCallback(boost::bind(object_chiclet_callback, _1));
 	LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1));
 	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1));
 
@@ -1545,6 +1639,11 @@ void LLScriptChiclet::setSessionId(const LLUUID& session_id)
 	}
 }
 
+void LLScriptChiclet::setCounter(S32 counter)
+{
+	setShowNewMessagesIcon( counter > 0 );
+}
+
 void LLScriptChiclet::onMouseDown()
 {
 	LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId());
@@ -1601,6 +1700,11 @@ void LLInvOfferChiclet::setSessionId(const LLUUID& session_id)
 	}
 }
 
+void LLInvOfferChiclet::setCounter(S32 counter)
+{
+	setShowNewMessagesIcon( counter > 0 );
+}
+
 void LLInvOfferChiclet::onMouseDown()
 {
 	LLScriptFloaterManager::instance().toggleScriptFloater(getSessionId());
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 609ce167136bfec918467d6d45bd3fce177c574f..65abcd1f5fcd70d9203467877593b27d21ce8f7c 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -315,7 +315,7 @@ class LLIMChiclet : public LLChiclet
 	{
 		Optional<std::string> new_messages_icon_name;
 
-		Params() : new_messages_icon_name("new_messages_icon_name", "icn_voice-localchat.tga")
+		Params() : new_messages_icon_name("new_messages_icon_name", "Unread_IM")
 		{}
 	};
 
@@ -389,7 +389,7 @@ class LLIMChiclet : public LLChiclet
 	 * Made public so that it can be triggered from outside
 	 * (more specifically, from the Active IM window).
 	 */
-	void onMouseDown();
+	virtual void onMouseDown();
 
 protected:
 
@@ -594,7 +594,7 @@ class LLScriptChiclet : public LLIMChiclet
 
 	/*virtual*/ void setSessionId(const LLUUID& session_id);
 
-	/*virtual*/ void setCounter(S32 counter){}
+	/*virtual*/ void setCounter(S32 counter);
 
 	/*virtual*/ S32 getCounter() { return 0; }
 
@@ -634,7 +634,7 @@ class LLInvOfferChiclet: public LLIMChiclet
 
 	/*virtual*/ void setSessionId(const LLUUID& session_id);
 
-	/*virtual*/ void setCounter(S32 counter){}
+	/*virtual*/ void setCounter(S32 counter);
 
 	/*virtual*/ S32 getCounter() { return 0; }
 
@@ -745,7 +745,7 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 
 /**
  * Implements notification chiclet. Used to display total amount of unread messages 
- * across all IM sessions, total amount of system notifications.
+ * across all IM sessions, total amount of system notifications. See EXT-3147 for details
  */
 class LLSysWellChiclet : public LLChiclet
 {
@@ -757,6 +757,24 @@ class LLSysWellChiclet : public LLChiclet
 
 		Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
 
+		/**
+		 * Contains maximum displayed count of unread messages. Default value is 9.
+		 *
+		 * If count is less than "max_unread_count" will be displayed as is.
+		 * Otherwise 9+ will be shown (for default value).
+		 */
+		Optional<S32> max_displayed_count;
+
+		/**
+		 * How many time chiclet should flash before set "Lit" state. Default value is 3.
+		 */
+		Optional<S32> flash_to_lit_count;
+
+		/**
+		 * Period of flashing while setting "Lit" state, in seconds. Default value is 0.5.
+		 */
+		Optional<F32> flash_period;
+
 		Params();
 	};
 
@@ -778,9 +796,26 @@ class LLSysWellChiclet : public LLChiclet
 	LLSysWellChiclet(const Params& p);
 	friend class LLUICtrlFactory;
 
+	/**
+	 * Change Well 'Lit' state from 'Lit' to 'Unlit' and vice-versa.
+	 *
+	 * There is an assumption that it will be called 2*N times to do not change its start state.
+	 * @see FlashToLitTimer
+	 */
+	void changeLitState();
+
 protected:
+	class FlashToLitTimer;
 	LLButton* mButton;
 	S32 mCounter;
+	S32 mMaxDisplayedCount;
+
+	/**
+	 * How many times Well will blink.
+	 */
+	S32 mFlashToLitCount;
+	FlashToLitTimer* mFlashToLitTimer;
+
 };
 
 /**
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index b2399d238bdc00c00f6b2a28b8713b8dbe2311f8..dc6847f2360cdec2ce46d352e9638cb05382d0fd 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -306,13 +306,16 @@ void LLColorSwatchCtrl::onColorChanged ( void* data, EColorPickOp pick_op )
 	}
 }
 
-void LLColorSwatchCtrl::onFloaterClose()
+// This is called when the main floatercustomize panel is closed.
+// Since this class has pointers up to its parents, we need to cleanup
+// this class first in order to avoid a crash.
+void LLColorSwatchCtrl::onParentFloaterClosed()
 {
 	LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
-
 	if (pickerp)
 	{
 		pickerp->setSwatch(NULL);
+		pickerp->closeFloater();
 	}
 
 	mPickerHandle.markDead();
diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h
index 2f6aec85e86bbd6adff4e2c7aea7782ea5921771..4bb7d837cbe32865027f12fb8b9ed95ad62cb2e1 100644
--- a/indra/newview/llcolorswatch.h
+++ b/indra/newview/llcolorswatch.h
@@ -105,7 +105,7 @@ class LLColorSwatchCtrl
 	/*virtual*/ void	setEnabled( BOOL enabled );
 
 	static void		onColorChanged ( void* data, EColorPickOp pick_op = COLOR_CHANGE );
-	void			onFloaterClose();
+	void			onParentFloaterClosed();
 
 protected:
 	BOOL			mValid;
diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..00a20de30edc4639671fd432adfb938282c39275
--- /dev/null
+++ b/indra/newview/llcommanddispatcherlistener.cpp
@@ -0,0 +1,47 @@
+/**
+ * @file   llcommanddispatcherlistener.cpp
+ * @author Nat Goodspeed
+ * @date   2009-12-10
+ * @brief  Implementation for llcommanddispatcherlistener.
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llcommanddispatcherlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llcommandhandler.h"
+
+LLCommandDispatcherListener::LLCommandDispatcherListener(/* LLCommandDispatcher* instance */):
+    LLEventAPI("LLCommandDispatcher", "Access to LLCommandHandler commands") /* ,
+    mDispatcher(instance) */
+{
+    add("dispatch",
+        "Execute a command registered as an LLCommandHandler,\n"
+        "passing any required parameters:\n"
+        "[\"cmd\"] string command name\n"
+        "[\"params\"] array of parameters, as if from components of URL path\n"
+        "[\"query\"] map of parameters, as if from ?key1=val&key2=val\n"
+        "[\"trusted\"] boolean indicating trusted browser [default true]",
+        &LLCommandDispatcherListener::dispatch);
+}
+
+void LLCommandDispatcherListener::dispatch(const LLSD& params) const
+{
+    // For most purposes, we expect callers to want to be trusted.
+    bool trusted_browser = true;
+    if (params.has("trusted"))
+    {
+        // But for testing, allow a caller to specify untrusted.
+        trusted_browser = params["trusted"].asBoolean();
+    }
+    LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL,
+                                  trusted_browser);
+}
diff --git a/indra/newview/llcommanddispatcherlistener.h b/indra/newview/llcommanddispatcherlistener.h
new file mode 100644
index 0000000000000000000000000000000000000000..d0070ddd711caf8d13fe3866e70b5cf7f0b2425d
--- /dev/null
+++ b/indra/newview/llcommanddispatcherlistener.h
@@ -0,0 +1,30 @@
+/**
+ * @file   llcommanddispatcherlistener.h
+ * @author Nat Goodspeed
+ * @date   2009-12-10
+ * @brief  LLEventAPI for LLCommandDispatcher
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLCOMMANDDISPATCHERLISTENER_H)
+#define LL_LLCOMMANDDISPATCHERLISTENER_H
+
+#include "lleventapi.h"
+class LLCommandDispatcher;
+class LLSD;
+
+class LLCommandDispatcherListener: public LLEventAPI
+{
+public:
+    LLCommandDispatcherListener(/* LLCommandDispatcher* instance */); // all static members
+
+private:
+    void dispatch(const LLSD& params) const;
+
+    //LLCommandDispatcher* mDispatcher;
+};
+
+#endif /* ! defined(LL_LLCOMMANDDISPATCHERLISTENER_H) */
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index af6488388a39add5cf462851bd0e9b490a79a1ba..8c7e7bea83b91be92abf6a0680ddca920c787726 100644
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -34,12 +34,16 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llcommandhandler.h"
+#include "llnotificationsutil.h"
+#include "llcommanddispatcherlistener.h"
 
 // system includes
 #include <boost/tokenizer.hpp>
 
 #define THROTTLE_PERIOD    15    // required secs between throttled commands
 
+static LLCommandDispatcherListener sCommandDispatcherListener;
+
 //---------------------------------------------------------------------------
 // Underlying registry for command handlers, not directly accessible.
 //---------------------------------------------------------------------------
@@ -93,6 +97,8 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
 										LLMediaCtrl* web,
 										bool trusted_browser)
 {
+	static bool slurl_blocked = false;
+	static bool slurl_throttled = false;
 	static F64 last_throttle_time = 0.0;
 	F64 cur_time = 0.0;
 	std::map<std::string, LLCommandHandlerInfo>::iterator it = mMap.find(cmd);
@@ -110,6 +116,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
 			// block request from external browser, but report as
 			// "handled" because it was well formatted.
 			LL_WARNS_ONCE("SLURL") << "Blocked SLURL command from untrusted browser" << LL_ENDL;
+			if (! slurl_blocked)
+			{
+				LLNotificationsUtil::add("BlockedSLURL");
+				slurl_blocked = true;
+			}
 			return true;
 
 		case LLCommandHandler::UNTRUSTED_THROTTLE:
@@ -119,6 +130,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
 				// block request from external browser if it happened
 				// within THROTTLE_PERIOD secs of the last command
 				LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL;
+				if (! slurl_throttled)
+				{
+					LLNotificationsUtil::add("ThrottledSLURL");
+					slurl_throttled = true;
+				}
 				return true;
 			}
 			last_throttle_time = cur_time;
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
index 57bb93d81afef3ea51355af4372a798bbdd70dd8..b9e0f928f14dc1271053c3741c86d13073af01be 100644
--- a/indra/newview/llfloaterchat.cpp
+++ b/indra/newview/llfloaterchat.cpp
@@ -41,6 +41,7 @@
 
 // project include
 #include "llagent.h"
+#include "llappviewer.h"
 #include "llbutton.h"
 #include "llcheckboxctrl.h"
 #include "llcombobox.h"
@@ -142,6 +143,10 @@ BOOL LLFloaterChat::postBuild()
 
 void LLFloaterChat::updateConsoleVisibility()
 {
+	if(gDisconnected)
+	{
+		return;
+	}
 	// determine whether we should show console due to not being visible
 	gConsole->setVisible( !isInVisibleChain()								// are we not in part of UI being drawn?
 							|| isMinimized()								// are we minimized?
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 56b56dc3d2f3c8801033ac7dca04a775982097e5..73b79d8e132db5b1144a78e0beaab372a8f88017 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -241,16 +241,6 @@ BOOL LLFloaterColorPicker::postBuild()
     return TRUE;
 }
 
-/*virtual*/ 
-void LLFloaterColorPicker::onClose(bool app_settings)
-{
-	if (mSwatch)
-	{
-		mSwatch->onFloaterClose();
-	}
-	stopUsingPipette();
-}
-
 //////////////////////////////////////////////////////////////////////////////
 //
 void LLFloaterColorPicker::initUI ( F32 rValIn, F32 gValIn, F32 bValIn )
diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h
index b381740acd9092882997d99be47917163185ed42..0bbbe2051ce8f776f3d92fa47b1bf8ac930578b8 100644
--- a/indra/newview/llfloatercolorpicker.h
+++ b/indra/newview/llfloatercolorpicker.h
@@ -56,7 +56,6 @@ class LLFloaterColorPicker
 
 		// overrides
 		virtual BOOL postBuild ();
-		virtual void onClose(bool app_settings);
 		virtual void draw ();
 		virtual BOOL handleMouseDown ( S32 x, S32 y, MASK mask );
 		virtual BOOL handleMouseUp ( S32 x, S32 y, MASK mask );
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index ed0f24d16052fce9f35a04ad0e0bb75b1072a4ab..5b03292b22b4d95e0def974c3528e4bbdf928f7e 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2300,7 +2300,7 @@ void LLPanelLandAccess::refresh()
 		mListBanned->deleteAllItems();
 	
 	LLParcel *parcel = mParcel->getParcel();
-	
+		
 	// Display options
 	if (parcel)
 	{
@@ -2396,22 +2396,40 @@ void LLPanelLandAccess::refresh()
 				mListBanned->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix);
 			}
 		}
+		
+		LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+		if(region)
+		{
+			std::string region_access = "(";
+			region_access += region->getSimAccessString();
+			region_access += ")";
+			childSetLabelArg( "public_access", "[MATURITY]", region_access );
+		}
+		else
+		{
+			childSetLabelArg( "public_access", "[MATURITY]", std::string() );
+		}
+
 
 		if(parcel->getRegionDenyAnonymousOverride())
 		{
 			childSetValue("limit_payment", TRUE);
+			childSetLabelArg( "limit_payment", "[ESTATE_PAYMENT_LIMIT]", getString("access_estate_defined") );
 		}
 		else
 		{
 			childSetValue("limit_payment", (parcel->getParcelFlag(PF_DENY_ANONYMOUS)));
+			childSetLabelArg( "limit_payment", "[ESTATE_PAYMENT_LIMIT]", std::string() );
 		}
 		if(parcel->getRegionDenyAgeUnverifiedOverride())
 		{
 			childSetValue("limit_age_verified", TRUE);
+			childSetLabelArg( "limit_age_verified", "[ESTATE_AGE_LIMIT]", getString("access_estate_defined") );
 		}
 		else
 		{
 			childSetValue("limit_age_verified", (parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED)));
+			childSetLabelArg( "limit_age_verified", "[ESTATE_AGE_LIMIT]", std::string() );
 		}
 		
 		BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST);
diff --git a/indra/newview/llfloaterparcel.cpp b/indra/newview/llfloaterparcel.cpp
index 88a39a495fd6702cbd733c665af033ac8ccfc637..e2be78411634090a054c32db79dee80f7535d1da 100644
--- a/indra/newview/llfloaterparcel.cpp
+++ b/indra/newview/llfloaterparcel.cpp
@@ -40,6 +40,7 @@
 // viewer project includes
 #include "llcommandhandler.h"
 #include "llpanelplace.h"
+#include "llsidetray.h"
 
 // linden library includes
 #include "lluuid.h"
@@ -70,7 +71,10 @@ class LLParcelHandler : public LLCommandHandler
 		{
 			if (parcel_id.notNull())
 			{
-				LLFloaterReg::showInstance("parcel_info", LLSD(parcel_id));
+				LLSD key;
+				key["type"] = "remote_place";
+				key["id"] = parcel_id;
+				LLSideTray::getInstance()->showPanel("panel_places", key);
 				return true;
 			}
 		}
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 05a46ad89451e4b40a34d1acffe2f0bbeb048fe5..8a26078f3d3fe4643664a169ebd0fa525e8104af 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -88,8 +88,6 @@
 #include "lltrans.h"
 #include "llagentui.h"
 
-#define ELAR_ENABLED 0 // Enable when server support is implemented
-
 const S32 TERRAIN_TEXTURE_COUNT = 4;
 const S32 CORNER_COUNT = 4;
 
@@ -1995,11 +1993,6 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
 	childSetEnabled("remove_banned_avatar_btn",		god || owner || manager);
 	childSetEnabled("message_estate_btn",			god || owner || manager);
 	childSetEnabled("kick_user_from_estate_btn",	god || owner || manager);
-#if ELAR_ENABLED
-	childSetEnabled("abuse_email_address", 			god || owner || manager);
-#else
-	childSetEnabled("abuse_email_address", 			false);
-#endif
 
 	// estate managers can't add estate managers
 	childSetEnabled("add_estate_manager_btn",		god || owner);
@@ -2065,8 +2058,6 @@ BOOL LLPanelEstateInfo::postBuild()
 	initCtrl("limit_payment");
 	initCtrl("limit_age_verified");
 	initCtrl("voice_chat_check");
-	getChild<LLUICtrl>("abuse_email_address")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAnything, this));
-	getChild<LLLineEditor>("abuse_email_address")->setKeystrokeCallback(onChangeText, this);
 
 	// set up the use global time checkbox
 	getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this));
@@ -2276,8 +2267,6 @@ bool LLPanelEstateInfo::commitEstateInfoCaps()
 	}
 	body["sun_hour"] = sun_hour;
 
-	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(this));
     return true;
@@ -2436,16 +2425,6 @@ void LLPanelEstateInfo::setOwnerName(const std::string& name)
 	childSetValue("estate_owner", LLSD(name));
 }
 
-const std::string LLPanelEstateInfo::getAbuseEmailAddress() const
-{
-	return childGetValue("abuse_email_address").asString();
-}
-
-void LLPanelEstateInfo::setAbuseEmailAddress(const std::string& address)
-{
-	childSetValue("abuse_email_address", LLSD(address));
-}
-
 void LLPanelEstateInfo::setAccessAllowedEnabled(bool enable_agent,
 												bool enable_group,
 												bool enable_ban)
@@ -2954,18 +2933,6 @@ bool LLDispatchEstateUpdateInfo::operator()(
 	std::string estate_name = strings[0].c_str(); // preserve c_str() call!
 	panel->setEstateName(estate_name);
 	
-#if ELAR_ENABLED
-	if (strings.size() > 9)
-	{
-		std::string abuse_email = strings[9].c_str(); // preserve c_str() call!
-		panel->setAbuseEmailAddress(abuse_email);
-	}
-	else
-#endif
-	{
-		panel->setAbuseEmailAddress(panel->getString("email_unsupported"));
-	}
-
 	LLViewerRegion* regionp = gAgent.getRegion();
 
 	LLUUID owner_id(strings[1]);
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index a3b91223b78bed0785923fcaf73af96104e99f8b..704166d1065e66b22c612f04290a5b5039bd2993 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -330,9 +330,6 @@ class LLPanelEstateInfo : public LLPanelRegionInfo
 	const std::string getOwnerName() const;
 	void setOwnerName(const std::string& name);
 
-	const std::string getAbuseEmailAddress() const;
-	void setAbuseEmailAddress(const std::string& address);
-
 	// If visible from mainland, allowed agent and allowed groups
 	// are ignored, so must disable UI.
 	void setAccessAllowedEnabled(bool enable_agent, bool enable_group, bool enable_ban);
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 408303a1e0474f142b6b9d9f8057a65ea836244f..932e49c79be542cd5e015149938fed648da7232d 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -95,7 +95,6 @@ const U32 INCLUDE_SCREENSHOT  = 0x01 << 0;
 LLFloaterReporter::LLFloaterReporter(const LLSD& key)
 :	LLFloater(key),
 	mReportType(COMPLAINT_REPORT),
-	mEmailToEstateOwner(FALSE),
 	mObjectID(),
 	mScreenID(),
 	mAbuserID(),
@@ -117,18 +116,7 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
 	
 	if ( LLFloaterReg::instanceVisible("reporter") )
 	{
-		LLFloaterReporter *f = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
-		BOOL email_to_estate_owner = ( region_flags & REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER );
-		f->mEmailToEstateOwner = email_to_estate_owner;
-
-		if ( email_to_estate_owner )
-		{
-			LLNotificationsUtil::add("HelpReportAbuseEmailEO");
-		}
-		else
-		{
-			LLNotificationsUtil::add("HelpReportAbuseEmailLL");
-		}
+		LLNotificationsUtil::add("HelpReportAbuseEmailLL");
 	};
 }
 // virtual
@@ -218,17 +206,7 @@ LLFloaterReporter::~LLFloaterReporter()
 // virtual
 void LLFloaterReporter::draw()
 {
-	// this is set by a static callback sometime after the dialog is created.
-	// Only disable screenshot for abuse reports to estate owners
-	if ( mEmailToEstateOwner )
-	{
-		childSetValue("screen_check", FALSE );
-		childSetEnabled("screen_check", FALSE );
-	}
-	else
-	{
-		childSetEnabled("screen_check", TRUE );
-	}
+	childSetEnabled("screen_check", TRUE );
 
 	LLFloater::draw();
 }
@@ -637,11 +615,7 @@ LLSD LLFloaterReporter::gatherReport()
 	LLUUID screenshot_id = LLUUID::null;
 	if (childGetValue("screen_check"))
 	{
-
-		if ( mEmailToEstateOwner == FALSE )
-		{
-			screenshot_id = childGetValue("screenshot");
-		}
+		screenshot_id = childGetValue("screenshot");
 	};
 
 	LLSD report = LLSD::emptyMap();
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index 917f51364170d4617d4f29bbaa6e59b325427433..a3776f3d279715f90a1a4240af71a87c56d42abc 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -124,7 +124,6 @@ class LLFloaterReporter
 
 private:
 	EReportType		mReportType;
-	BOOL			mEmailToEstateOwner;
 	LLUUID 			mObjectID;
 	LLUUID			mScreenID;
 	LLUUID			mAbuserID;
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 2c618263ec497012b2840c2756b1745f4adc4e9d..c6589637080ddb3d6fce93925292b94c28ec8afb 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -42,7 +42,8 @@
 LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
 	LLFloater(key),
 	LLViewerMediaObserver(),
-	mBrowser(NULL)
+	mBrowser(NULL),
+	mSearchGodLevel(0)
 {
 	// declare a map that transforms a category name into
 	// the URL suffix that is used to search that category
@@ -86,12 +87,21 @@ void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent eve
 	case MEDIA_EVENT_NAVIGATE_COMPLETE:
 		childSetText("status_text", getString("done_text"));
 		break;
-		
+
 	default:
 		break;
 	}
 }
 
+void LLFloaterSearch::godLevelChanged(U8 godlevel)
+{
+	// search results can change based upon god level - if the user
+	// changes god level, then give them a warning (we don't refresh
+	// the search as this might undo any page navigation or
+	// AJAX-driven changes since the last search).
+	childSetVisible("refresh_search", (godlevel != mSearchGodLevel));
+}
+
 void LLFloaterSearch::search(const LLSD &key)
 {
 	if (! mBrowser)
@@ -99,6 +109,10 @@ void LLFloaterSearch::search(const LLSD &key)
 		return;
 	}
 
+	// reset the god level warning as we're sending the latest state
+	childHide("refresh_search");
+	mSearchGodLevel = gAgent.getGodLevel();
+
 	// get the URL for the search page
 	std::string url = getString("search_url");
 	if (! LLStringUtil::endsWith(url, "/"))
diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h
index 743107484f9a43f51e3b7db6865d34a49b76a241..ba817adf7f060271b877a55d72419cbe7491af11 100644
--- a/indra/newview/llfloatersearch.h
+++ b/indra/newview/llfloatersearch.h
@@ -66,14 +66,20 @@ class LLFloaterSearch :
 	///    "events", "groups", "wiki", "destinations", "classifieds"
 	void search(const LLSD &key);
 
+	/// changing godmode can affect the search results that are
+	/// returned by the search website - use this method to tell the
+	/// search floater that the user has changed god level.
+	void godLevelChanged(U8 godlevel);
+
 private:
 	/*virtual*/ BOOL postBuild();
 
 	// inherited from LLViewerMediaObserver
 	/*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event);
-	
+
 	LLMediaCtrl *mBrowser;
 	LLSD        mCategoryPaths;
+	U8          mSearchGodLevel;
 };
 
 #endif  // LL_LLFLOATERSEARCH_H
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 6ba032c152651f77d49c68a5c4b0e03f8f230396..d08d47bc8144afed48e5cbf1c0d8628b0bb73884 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -991,7 +991,7 @@ S32 LLFloaterTools::calcRenderCost()
 			if (viewer_volume)
 			{
 				cost += viewer_volume->getRenderCost(textures);
-				cost += textures.size() * 5;
+				cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
 				textures.clear();
 			}
 		}
diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp
index 43024a4bd03fd3ae7178fda4dc29feb774d0cf73..3951f4291f7b7ce3fd4fe3e069e51f97ea2acf7c 100644
--- a/indra/newview/llfloatervoicedevicesettings.cpp
+++ b/indra/newview/llfloatervoicedevicesettings.cpp
@@ -40,7 +40,6 @@
 #include "llcombobox.h"
 #include "llfocusmgr.h"
 #include "lliconctrl.h"
-#include "llsliderctrl.h"
 #include "llviewercontrol.h"
 #include "llvoiceclient.h"
 #include "llvoicechannel.h"
@@ -61,9 +60,6 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
 	mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
 	mDevicesUpdated = FALSE;
 
-	// grab "live" mic volume level
-	mMicVolume = gSavedSettings.getF32("AudioLevelMic");
-
 	// ask for new device enumeration
 	// now do this in onOpen() instead...
 	//gVoiceClient->refreshDeviceLists();
@@ -75,10 +71,6 @@ LLPanelVoiceDeviceSettings::~LLPanelVoiceDeviceSettings()
 
 BOOL LLPanelVoiceDeviceSettings::postBuild()
 {
-	LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
-	// set mic volume tuning slider based on last mic volume setting
-	volume_slider->setValue(mMicVolume);
-
 	childSetCommitCallback("voice_input_device", onCommitInputDevice, this);
 	childSetCommitCallback("voice_output_device", onCommitOutputDevice, this);
 	
@@ -157,15 +149,6 @@ void LLPanelVoiceDeviceSettings::apply()
 		gSavedSettings.setString("VoiceOutputAudioDevice", s);
 		mOutputDevice = s;
 	}
-
-	// assume we are being destroyed by closing our embedding window
-	LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
-	if(volume_slider)
-	{
-		F32 slider_value = (F32)volume_slider->getValue().asReal();
-		gSavedSettings.setF32("AudioLevelMic", slider_value);
-		mMicVolume = slider_value;
-	}
 }
 
 void LLPanelVoiceDeviceSettings::cancel()
@@ -178,22 +161,12 @@ void LLPanelVoiceDeviceSettings::cancel()
 
 	if(mCtrlOutputDevices)
 		mCtrlOutputDevices->setSimple(mOutputDevice);
-
-	gSavedSettings.setF32("AudioLevelMic", mMicVolume);
-	LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
-	if(volume_slider)
-	{
-		volume_slider->setValue(mMicVolume);
-	}
 }
 
 void LLPanelVoiceDeviceSettings::refresh()
 {
-	//grab current volume
-	LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
-	// set mic volume tuning slider based on last mic volume setting
-	F32 current_volume = (F32)volume_slider->getValue().asReal();
-	gVoiceClient->tuningSetMicVolume(current_volume);
+	// update the live input level display
+	gVoiceClient->tuningSetMicVolume();
 
 	// Fill in popup menus
 	mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
@@ -263,7 +236,6 @@ void LLPanelVoiceDeviceSettings::initialize()
 {
 	mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
 	mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
-	mMicVolume = gSavedSettings.getF32("AudioLevelMic");
 	mDevicesUpdated = FALSE;
 
 	// ask for new device enumeration
diff --git a/indra/newview/llfloatervoicedevicesettings.h b/indra/newview/llfloatervoicedevicesettings.h
index d67283d0a224d5a4357bbeb4cb97c086998a3806..20958af780c37b084e1791a79ccc3c4fb30c2c99 100644
--- a/indra/newview/llfloatervoicedevicesettings.h
+++ b/indra/newview/llfloatervoicedevicesettings.h
@@ -56,7 +56,6 @@ class LLPanelVoiceDeviceSettings : public LLPanel
 	static void onCommitInputDevice(LLUICtrl* ctrl, void* user_data);
 	static void onCommitOutputDevice(LLUICtrl* ctrl, void* user_data);
 
-	F32 mMicVolume;
 	std::string mInputDevice;
 	std::string mOutputDevice;
 	class LLComboBox		*mCtrlInputDevices;
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 1c5d7ae9b99797f5a08999e9885c4c0eeb257eaf..321982ceb62d780b050f1eeea9064fc22facba0f 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -411,7 +411,12 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
 			folderp->setVisible(show_folder_state == LLInventoryFilter::SHOW_ALL_FOLDERS || // always show folders?
 									(folderp->getFiltered(filter_generation) || folderp->hasFilteredDescendants(filter_generation))); // passed filter or has descendants that passed filter
 		}
-		if (folderp->getVisible())
+
+		// Need to call arrange regardless of visibility, since children's visibility
+		// might need to be changed too (e.g. even though a folder is invisible, its
+		// children also need to be set invisible for state-tracking purposes, e.g.
+		// llfolderviewitem::filter).
+		// if (folderp->getVisible())
 		{
 			S32 child_height = 0;
 			S32 child_width = 0;
@@ -479,13 +484,13 @@ void LLFolderView::filter( LLInventoryFilter& filter )
 
 	if (getCompletedFilterGeneration() < filter.getCurrentGeneration())
 	{
-		mFiltered = FALSE;
+		mPassedFilter = FALSE;
 		mMinWidth = 0;
 		LLFolderViewFolder::filter(filter);
 	}
 	else
 	{
-		mFiltered = TRUE;
+		mPassedFilter = TRUE;
 	}
 }
 
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 5bef3064851ef3223dcc1e9224e456cf0eca49b3..135821f662db00b9acfcc115425097a360d80f9c 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -40,6 +40,7 @@
 #include "llinventoryfilter.h"
 #include "llpanel.h"
 #include "llviewercontrol.h"	// gSavedSettings
+#include "llviewerinventory.h"
 #include "llviewerwindow.h"		// Argh, only for setCursor()
 
 // linden library includes
@@ -121,7 +122,7 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
 	mHasVisibleChildren(FALSE),
 	mIndentation(0),
 	mNumDescendantsSelected(0),
-	mFiltered(FALSE),
+	mPassedFilter(FALSE),
 	mLastFilterGeneration(-1),
 	mStringMatchOffset(std::string::npos),
 	mControlLabelRotation(0.f),
@@ -223,17 +224,17 @@ BOOL LLFolderViewItem::potentiallyVisible()
 
 BOOL LLFolderViewItem::getFiltered() 
 { 
-	return mFiltered && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration(); 
+	return mPassedFilter && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration(); 
 }
 
 BOOL LLFolderViewItem::getFiltered(S32 filter_generation) 
 {
-	return mFiltered && mLastFilterGeneration >= filter_generation;
+	return mPassedFilter && mLastFilterGeneration >= filter_generation;
 }
 
 void LLFolderViewItem::setFiltered(BOOL filtered, S32 filter_generation)
 {
-	mFiltered = filtered;
+	mPassedFilter = filtered;
 	mLastFilterGeneration = filter_generation;
 }
 
@@ -423,19 +424,20 @@ S32 LLFolderViewItem::getItemHeight()
 
 void LLFolderViewItem::filter( LLInventoryFilter& filter)
 {
-	BOOL filtered = mListener && filter.check(this);
+	const BOOL previous_passed_filter = mPassedFilter;
+	const BOOL passed_filter = mListener && filter.check(this);
 
-	// if our visibility will change as a result of this filter, then
+	// If our visibility will change as a result of this filter, then
 	// we need to be rearranged in our parent folder
-	if (getVisible() != filtered)
+	if (mParentFolder)
 	{
-		if (mParentFolder)
-		{
+		if (getVisible() != passed_filter)
+			mParentFolder->requestArrange();
+		if (passed_filter != previous_passed_filter)
 			mParentFolder->requestArrange();
-		}
 	}
 
-	setFiltered(filtered, filter.getCurrentGeneration());
+	setFiltered(passed_filter, filter.getCurrentGeneration());
 	mStringMatchOffset = filter.getStringMatchOffset();
 	filter.decrementFilterCount();
 
@@ -603,6 +605,11 @@ const std::string& LLFolderViewItem::getSearchableLabel() const
 	return mSearchableLabel;
 }
 
+LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void)
+{
+	return gInventory.getItem(getListener()->getUUID());
+}
+
 std::string LLFolderViewItem::getName( void ) const
 {
 	if(mListener)
@@ -1237,7 +1244,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
 	if (getLastFilterGeneration() < filter_generation)
 	{
 		if (getLastFilterGeneration() >= must_pass_generation &&		// folder has been compared to a valid precursor filter
-			!mFiltered)													// and did not pass the filter
+			!mPassedFilter)													// and did not pass the filter
 		{
 			// go ahead and flag this folder as done
 			mLastFilterGeneration = filter_generation;			
@@ -1375,7 +1382,7 @@ void LLFolderViewFolder::setFiltered(BOOL filtered, S32 filter_generation)
 {
 	// if this folder is now filtered, but wasn't before
 	// (it just passed)
-	if (filtered && !mFiltered)
+	if (filtered && !mPassedFilter)
 	{
 		// reset current height, because last time we drew it
 		// it might have had more visible items than now
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 0ea031108bdb1e70f545126bc270daec77c97f76..620aa070b99a6aa775af10d69798a375ac4aeca7 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -45,6 +45,7 @@ class LLFolderViewListenerFunctor;
 class LLInventoryFilter;
 class LLMenuGL;
 class LLUIImage;
+class LLViewerInventoryItem;
 
 // These are grouping of inventory types.
 // Order matters when sorting system folders to the top.
@@ -120,6 +121,9 @@ class LLFolderViewItem : public LLView
 	static const F32 FOLDER_CLOSE_TIME_CONSTANT;
 	static const F32 FOLDER_OPEN_TIME_CONSTANT;
 
+	// Mostly for debugging printout purposes.
+	const std::string& getSearchableLabel() { return mSearchableLabel; }
+
 protected:
 	friend class LLUICtrlFactory;
 	friend class LLFolderViewEventListener;
@@ -148,7 +152,7 @@ class LLFolderViewItem : public LLView
 	BOOL						mHasVisibleChildren;
 	S32							mIndentation;
 	S32							mNumDescendantsSelected;
-	BOOL						mFiltered;
+	BOOL						mPassedFilter;
 	S32							mLastFilterGeneration;
 	std::string::size_type		mStringMatchOffset;
 	F32							mControlLabelRotation;
@@ -156,8 +160,8 @@ class LLFolderViewItem : public LLView
 	BOOL						mDragAndDropTarget;
 	LLUIImagePtr				mArrowImage;
 	LLUIImagePtr				mBoxImage;
-	BOOL                            mIsLoading;
-	LLTimer                         mTimeSinceRequestStart;
+	BOOL                        mIsLoading;
+	LLTimer                     mTimeSinceRequestStart;
 	bool						mDontShowInHierarchy;
 
 	// helper function to change the selection from the root.
@@ -202,7 +206,7 @@ class LLFolderViewItem : public LLView
 	virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
 	virtual S32 getItemHeight();
 	void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarchy = dont_show; }
-	bool getDontShowInHierarchy() { return mDontShowInHierarchy; }
+	bool getDontShowInHierarchy() const { return mDontShowInHierarchy; }
 
 	// applies filters to control visibility of inventory items
 	virtual void filter( LLInventoryFilter& filter);
@@ -281,6 +285,9 @@ class LLFolderViewItem : public LLView
 
 	const LLFolderViewEventListener* getListener( void ) const { return mListener; }
 	LLFolderViewEventListener* getListener( void ) { return mListener; }
+	
+	// Gets the inventory item if it exists (null otherwise)
+	LLViewerInventoryItem * getInventoryItem(void);
 
 	// just rename the object.
 	void rename(const std::string& new_name);
@@ -328,7 +335,7 @@ class LLFolderViewItem : public LLView
 		EAcceptance* accept,
 		std::string& tooltip_msg);
 
- private:
+private:
 	static std::map<U8, LLFontGL*> sFonts; // map of styles to fonts
 };
 
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 2bc07d0c27427bb819ca31a5a604b0ec8223ad96..47a168e354999135ae96e44ec83f459af5c99362 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -90,8 +90,20 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
 		case IM_SESSION_CONFERENCE_START:
 			mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this);
 			break;
-		default:
+		case IM_SESSION_GROUP_START:
 			mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this);
+			break;
+		case IM_SESSION_INVITE:		
+			if (gAgent.isInGroup(mSessionID))
+			{
+				mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this);
+			}
+			else
+			{
+				mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this);
+			}
+			break;
+		default: break;
 		}
 	}
 }
@@ -415,6 +427,7 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
 	if(channel)
 	{
 		channel->updateShowToastsState();
+		channel->redrawToasts();
 	}
 }
 
@@ -439,6 +452,7 @@ void LLIMFloater::setVisible(BOOL visible)
 	if(channel)
 	{
 		channel->updateShowToastsState();
+		channel->redrawToasts();
 	}
 
 	if (visible && mChatHistory && mInputEditor)
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 6c4af0522f4f00a5db24a5884dad3ba1bdb811d6..4d2ba16a4cf1c61c20fad5742fa0aad16d3b48b4 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -88,6 +88,9 @@ const static std::string IM_TEXT("message");
 const static std::string IM_FROM("from");
 const static std::string IM_FROM_ID("from_id");
 
+const static std::string NO_SESSION("(IM Session Doesn't Exist)");
+const static std::string ADHOC_NAME_SUFFIX(" Conference");
+
 std::string LLCallDialogManager::sPreviousSessionlName = "";
 std::string LLCallDialogManager::sCurrentSessionlName = "";
 LLIMModel::LLIMSession* LLCallDialogManager::sSession = NULL;
@@ -116,6 +119,13 @@ void toast_callback(const LLSD& msg){
 		return;
 	}
 
+	// Skip toasting if we have open window of IM with this session id
+	LLIMFloater* open_im_floater = LLIMFloater::findInstance(msg["session_id"]);
+	if (open_im_floater && open_im_floater->getVisible())
+	{
+		return;
+	}
+
 	LLSD args;
 	args["MESSAGE"] = msg["message"];
 	args["TIME"] = msg["time"];
@@ -154,11 +164,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	mInitialTargetIDs(ids),
 	mVoiceChannel(NULL),
 	mSpeakers(NULL),
-	mCallDialogManager(NULL),
 	mSessionInitialized(false),
 	mCallBackEnabled(true),
 	mTextIMPossible(true),
-	mOtherParticipantIsAvatar(true)
+	mOtherParticipantIsAvatar(true),
+	mStartCallOnInitialize(false)
 {
 	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
 	{
@@ -287,9 +297,6 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
 
 LLIMModel::LLIMSession::~LLIMSession()
 {
-	delete mCallDialogManager;
-	mCallDialogManager = NULL;
-
 	delete mSpeakers;
 	mSpeakers = NULL;
 
@@ -413,6 +420,12 @@ void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, con
 		{
 			im_floater->sessionInitReplyReceived(new_session_id);
 		}
+
+		// auto-start the call on session initialization?
+		if (session->mStartCallOnInitialize)
+		{
+			gIMMgr->startCall(new_session_id);
+		}
 	}
 
 	//*TODO remove this "floater" stuff when Communicate Floater is gone
@@ -448,10 +461,16 @@ void LLIMModel::testMessages()
 	addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ.");
 }
 
-
+//session name should not be empty
 bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, 
 						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
 {
+	if (name.empty())
+	{
+		llwarns << "Attempt to create a new session with empty name; id = " << session_id << llendl;
+		return false;
+	}
+
 	if (findIMSession(session_id))
 	{
 		llwarns << "IM Session " << session_id << " already exists" << llendl;
@@ -608,7 +627,7 @@ const std::string& LLIMModel::getName(const LLUUID& session_id) const
 	if (!session) 
 	{
 		llwarns << "session " << session_id << "does not exist " << llendl;
-		return LLStringUtil::null;
+		return NO_SESSION;
 	}
 
 	return session->mName;
@@ -995,18 +1014,6 @@ bool LLIMModel::sendStartSession(
 	return false;
 }
 
-// static
-void LLIMModel::sendSessionInitialized(const LLUUID &session_id)
-{
-	LLIMSession* session = getInstance()->findIMSession(session_id);
-	if (session)
-	{
-		LLSD arg;
-		arg["session_id"] = session_id;
-		getInstance()->mSessionInitializedSignal(arg);
-	}
-}
-
 //
 // Helper Functions
 //
@@ -1079,7 +1086,7 @@ class LLViewerChatterBoxInvitationAcceptResponder :
 			if ( 404 == statusNum )
 			{
 				std::string error_string;
-				error_string = "does not exist";
+				error_string = "session_does_not_exist_error";
 				gIMMgr->showSessionStartError(error_string, mSessionID);
 			}
 		}
@@ -1268,6 +1275,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 {
 	LLSD mCallDialogPayload;
 	LLOutgoingCallDialog* ocd;
+	bool is_incoming;
 
 	mCallDialogPayload["session_id"] = sSession->mSessionID;
 	mCallDialogPayload["session_name"] = sSession->mName;
@@ -1277,8 +1285,10 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 	switch(new_state)
 	{			
 	case LLVoiceChannel::STATE_CALL_STARTED :
-		// do not show "Calling to..." if it is incoming P2P call
-		if(sSession->mSessionType == LLIMModel::LLIMSession::P2P_SESSION && static_cast<LLVoiceChannelP2P*>(sSession->mVoiceChannel)->isIncomingCall())
+		// do not show "Calling to..." if it is incoming call
+		is_incoming = LLVoiceClient::getInstance()->isSessionIncoming(sSession->mSessionID);
+		// *TODO: implement for AdHoc and Group voice chats
+		if(is_incoming)
 		{
 			return;
 		}
@@ -1290,6 +1300,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 			ocd->getChild<LLTextBox>("leaving")->setVisible(true);
 			ocd->getChild<LLTextBox>("connecting")->setVisible(false);
 			ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
+			ocd->getChild<LLButton>("Cancel")->setVisible(true);
 		}
 		return;
 
@@ -1301,10 +1312,12 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 			ocd->getChild<LLTextBox>("leaving")->setVisible(true);
 			ocd->getChild<LLTextBox>("connecting")->setVisible(true);
 			ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
+			ocd->getChild<LLButton>("Cancel")->setVisible(true);
 		}
 		return;
 
 	case LLVoiceChannel::STATE_ERROR :
+		mCallDialogPayload["start_timer"] = true;
 		ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
 		if (ocd)
 		{
@@ -1312,6 +1325,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 			ocd->getChild<LLTextBox>("leaving")->setVisible(false);
 			ocd->getChild<LLTextBox>("connecting")->setVisible(false);
 			ocd->getChild<LLTextBox>("noanswer")->setVisible(true);
+			ocd->getChild<LLButton>("Cancel")->setVisible(false);
 		}
 		return;
 
@@ -1363,6 +1377,33 @@ LLCallDialog(payload)
 		instance->onCancel(instance);
 	}	
 }
+void LLOutgoingCallDialog::draw()
+{
+	if (lifetimeHasExpired())
+	{
+		onLifetimeExpired();
+	}
+	LLDockableFloater::draw();
+}
+
+bool LLOutgoingCallDialog::lifetimeHasExpired()
+{
+	if (mLifetimeTimer.getStarted())
+	{
+		F32 elapsed_time = mLifetimeTimer.getElapsedTimeF32();
+		if (elapsed_time > LIFETIME) 
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+void LLOutgoingCallDialog::onLifetimeExpired()
+{
+	mLifetimeTimer.stop();
+	closeFloater();
+}
 
 void LLOutgoingCallDialog::onOpen(const LLSD& key)
 {
@@ -1391,6 +1432,13 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 	childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
 	LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 	icon->setValue(callee_id);
+
+	// stop timer by default
+	mLifetimeTimer.stop();
+	if(mPayload.has("start_timer"))
+	{
+		mLifetimeTimer.reset();
+	}
 }
 
 
@@ -1514,6 +1562,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
 		return;
 
 	LLUUID session_id = mPayload["session_id"].asUUID();
+	LLUUID caller_id = mPayload["caller_id"].asUUID();
+	std::string session_name = mPayload["session_name"].asString();
 	EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
 	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
 	bool voice = true;
@@ -1530,8 +1580,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
 		{
 			// create a normal IM session
 			session_id = gIMMgr->addP2PSession(
-				mPayload["session_name"].asString(),
-				mPayload["caller_id"].asUUID(),
+				session_name,
+				caller_id,
 				mPayload["session_handle"].asString(),
 				mPayload["session_uri"].asString());
 
@@ -1549,10 +1599,38 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
 		}
 		else
 		{
-			LLUUID new_session_id = gIMMgr->addSession(
-				mPayload["session_name"].asString(),
-				type,
-				session_id);
+			//session name should not be empty, but it can contain spaces so we don't trim
+			std::string correct_session_name = session_name;
+			if (session_name.empty())
+			{
+				llwarns << "Received an empty session name from a server" << llendl;
+				
+				switch(type){
+				case IM_SESSION_CONFERENCE_START:
+				case IM_SESSION_GROUP_START:
+				case IM_SESSION_INVITE:		
+					if (gAgent.isInGroup(session_id))
+					{
+						LLGroupData data;
+						if (!gAgent.getGroupData(session_id, data)) break;
+						correct_session_name = data.mName;
+					}
+					else
+					{
+						if (gCacheName->getFullName(caller_id, correct_session_name))
+						{
+							correct_session_name.append(ADHOC_NAME_SUFFIX); 
+						}
+					}
+					llinfos << "Corrected session name is " << correct_session_name << llendl; 
+					break;
+				default: 
+					llwarning("Received an empty session name from a server and failed to generate a new proper session name", 0);
+					break;
+				}
+			}
+			
+			LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id);
 			if (new_session_id != LLUUID::null)
 			{
 				LLIMFloater::show(new_session_id);
@@ -1929,6 +2007,15 @@ BOOL LLIMMgr::getIMReceived() const
 	return mIMReceived;
 }
 
+void LLIMMgr::autoStartCallOnStartup(const LLUUID& session_id)
+{
+	LLIMModel::LLIMSession *session = LLIMModel::getInstance()->findIMSession(session_id);
+	if (session)
+	{
+		session->mStartCallOnInitialize = true;
+	}	
+}
+
 LLUUID LLIMMgr::addP2PSession(const std::string& name,
 							const LLUUID& other_participant_id,
 							const std::string& voice_session_handle,
@@ -1979,6 +2066,12 @@ LLUUID LLIMMgr::addSession(
 		return LLUUID::null;
 	}
 
+	if (name.empty())
+	{
+		llwarning("Session name cannot be null!", 0);
+		return LLUUID::null;
+	}
+
 	LLUUID session_id = computeSessionID(dialog,other_participant_id);
 
 	bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index c002434a18389b9da421114b6bc1d5ccd6e873d0..f26889ac91d9d4114b9f12e89b574e5e2556d69f 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -81,7 +81,6 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 		SType mSessionType;
 		LLUUID mOtherParticipantID;
 		std::vector<LLUUID> mInitialTargetIDs;
-		LLCallDialogManager* mCallDialogManager;
 
 		// connection to voice channel state change signal
 		boost::signals2::connection mVoiceChannelStateChangeConnection;
@@ -105,6 +104,7 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 
 		bool mTextIMPossible;
 		bool mOtherParticipantIsAvatar;
+		bool mStartCallOnInitialize;
 	};
 	
 
@@ -124,7 +124,6 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	typedef boost::function<void(const LLSD&)> session_callback_t;
 	session_signal_t mNewMsgSignal;
 	session_signal_t mNoUnreadMsgsSignal;
-	session_signal_t mSessionInitializedSignal;
 	
 	/** 
 	 * Find an IM Session corresponding to session_id
@@ -139,10 +138,10 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 
 	boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); }
 	boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); }
-	boost::signals2::connection addSessionInitializedCallback(session_callback_t cb ) {	return mSessionInitializedSignal.connect(cb); }
 
 	/**
 	 * Create new session object in a model
+	 * @param name session name should not be empty, will return false if empty
 	 */
 	bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, 
 		const std::vector<LLUUID>& ids = std::vector<LLUUID>());
@@ -213,7 +212,6 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id,
 						  const std::vector<LLUUID>& ids, EInstantMessage dialog);
 	static void sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing);
-	static void sendSessionInitialized(const LLUUID &session_id);
 	static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id,
 								const LLUUID& other_participant_id, EInstantMessage dialog);
 
@@ -299,6 +297,7 @@ class LLIMMgr : public LLSingleton<LLIMMgr>
 	/**
 	 * Creates a P2P session with the requisite handle for responding to voice calls.
 	 * 
+	 * @param name session name, cannot be null
 	 * @param caller_uri - sip URI of caller. It should be always be passed into the method to avoid
 	 * incorrect working of LLVoiceChannel instances. See EXT-2985.
 	 */	
@@ -330,6 +329,9 @@ class LLIMMgr : public LLSingleton<LLIMMgr>
 	void notifyNewIM();
 	void clearNewIMNotification();
 
+	// automatically start a call once the session has initialized
+	void autoStartCallOnStartup(const LLUUID& session_id);
+
 	// IM received that you haven't seen yet
 	BOOL getIMReceived() const;
 
@@ -493,7 +495,16 @@ class LLOutgoingCallDialog : public LLCallDialog
 
 	static void onCancel(void* user_data);
 
+	// check timer state
+	/*virtual*/ void draw();
+
 private:
+	// lifetime timer for NO_ANSWER notification
+	LLTimer	mLifetimeTimer;
+	// lifetime duration for NO_ANSWER notification
+	static const S32 LIFETIME = 5;
+	bool lifetimeHasExpired();
+	void onLifetimeExpired();
 };
 
 // Globals
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 83beae29c1d6f3b83fb34075e5648ea8573b3de9..39114d64b4ddfcc6acf2041e5cdb4254e6033742 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -42,10 +42,12 @@
 #include "lldateutil.h"
 #include "llfloaterreporter.h"
 #include "llfloaterworldmap.h"
+#include "llimview.h"
 #include "llinspect.h"
 #include "llmutelist.h"
 #include "llpanelblockedlist.h"
 #include "llstartup.h"
+#include "llspeakers.h"
 #include "llviewermenu.h"
 #include "llvoiceclient.h"
 #include "llviewerobjectlist.h"
@@ -99,6 +101,12 @@ class LLInspectAvatar : public LLInspect
 	// Set the volume slider to this user's current client-side volume setting,
 	// hiding/disabling if the user is not nearby.
 	void updateVolumeSlider();
+
+	// Shows/hides moderator panel depending on voice state 
+	void updateModeratorPanel();
+
+	// Moderator ability to enable/disable voice chat for avatar
+	void toggleSelectedVoice(bool enabled);
 	
 	// Button callbacks
 	void onClickAddFriend();
@@ -205,10 +213,12 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
 	mCommitCallbackRegistrar.add("InspectAvatar.Report",	boost::bind(&LLInspectAvatar::onClickReport, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.FindOnMap",	boost::bind(&LLInspectAvatar::onClickFindOnMap, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.ZoomIn", boost::bind(&LLInspectAvatar::onClickZoomIn, this));
-	mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap",	boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));	
-	mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject",	
+	mCommitCallbackRegistrar.add("InspectAvatar.DisableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, false));
+	mCommitCallbackRegistrar.add("InspectAvatar.EnableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, true));
+	mEnableCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap",	boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));	
+	mEnableCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject",	
 		boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this));	
-	mVisibleCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", 
+	mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", 
 		boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
 	mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
 
@@ -277,6 +287,8 @@ void LLInspectAvatar::onOpen(const LLSD& data)
 	requestUpdate();
 
 	updateVolumeSlider();
+
+	updateModeratorPanel();
 }
 
 // virtual
@@ -366,6 +378,119 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)
 	mPropertiesRequest = NULL;
 }
 
+void LLInspectAvatar::updateModeratorPanel()
+{
+	bool enable_moderator_panel = false;
+
+    if (LLVoiceChannel::getCurrentVoiceChannel())
+    {
+		LLUUID session_id = LLVoiceChannel::getCurrentVoiceChannel()->getSessionID();
+
+		if (session_id != LLUUID::null)
+		{
+			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+
+			if (speaker_mgr)
+			{
+				LLPointer<LLSpeaker> self_speakerp = speaker_mgr->findSpeaker(gAgent.getID());
+				LLPointer<LLSpeaker> selected_speakerp = speaker_mgr->findSpeaker(mAvatarID);
+				
+				if(speaker_mgr->isVoiceActive() && selected_speakerp && 
+					((self_speakerp && self_speakerp->mIsModerator) || gAgent.isGodlike()))
+				{
+					getChild<LLUICtrl>("enable_voice")->setVisible(selected_speakerp->mModeratorMutedVoice);
+					getChild<LLUICtrl>("disable_voice")->setVisible(!selected_speakerp->mModeratorMutedVoice);
+
+					enable_moderator_panel = true;
+				}
+			}
+		}
+	}
+
+	if (enable_moderator_panel)
+	{
+		if (!getChild<LLUICtrl>("moderator_panel")->getVisible())
+		{
+			getChild<LLUICtrl>("moderator_panel")->setVisible(true);
+			// stretch the floater so it can accommodate the moderator panel
+			reshape(getRect().getWidth(), getRect().getHeight() + getChild<LLUICtrl>("moderator_panel")->getRect().getHeight());
+		}
+	}
+	else if (getChild<LLUICtrl>("moderator_panel")->getVisible())
+	{
+		getChild<LLUICtrl>("moderator_panel")->setVisible(false);
+		// shrink the inspector floater back to original size
+		reshape(getRect().getWidth(), getRect().getHeight() - getChild<LLUICtrl>("moderator_panel")->getRect().getHeight());					
+	}
+}
+
+void LLInspectAvatar::toggleSelectedVoice(bool enabled)
+{
+	LLUUID session_id = LLVoiceChannel::getCurrentVoiceChannel()->getSessionID();
+	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+
+	if (speaker_mgr)
+	{
+		if (!gAgent.getRegion())
+			return;
+
+		std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+		LLSD data;
+		data["method"] = "mute update";
+		data["session-id"] = session_id;
+		data["params"] = LLSD::emptyMap();
+		data["params"]["agent_id"] = mAvatarID;
+		data["params"]["mute_info"] = LLSD::emptyMap();
+		// ctrl value represents ability to type, so invert
+		data["params"]["mute_info"]["voice"] = !enabled;
+
+		class MuteVoiceResponder : public LLHTTPClient::Responder
+		{
+		public:
+			MuteVoiceResponder(const LLUUID& session_id)
+			{
+				mSessionID = session_id;
+			}
+
+			virtual void error(U32 status, const std::string& reason)
+			{
+				llwarns << status << ": " << reason << llendl;
+
+				if ( gIMMgr )
+				{
+					//403 == you're not a mod
+					//should be disabled if you're not a moderator
+					if ( 403 == status )
+					{
+						gIMMgr->showSessionEventError(
+							"mute",
+							"not_a_moderator",
+							mSessionID);
+					}
+					else
+					{
+						gIMMgr->showSessionEventError(
+							"mute",
+							"generic",
+							mSessionID);
+					}
+				}
+			}
+
+		private:
+			LLUUID mSessionID;
+		};
+
+		LLHTTPClient::post(
+			url,
+			data,
+			new MuteVoiceResponder(speaker_mgr->getSessionID()));
+	}
+
+	closeFloater();
+
+}
+
 void LLInspectAvatar::updateVolumeSlider()
 {
 	// By convention, we only display and toggle voice mutes, not all mutes
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 4abe93322ab34edd9f7dbabc46e85309ab7958e2..e361082f7b30e668424d1f140da139a8068aa35b 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -535,6 +535,8 @@ bool isWornLink(LLUUID link_id)
 		if (LLGestureManager::instance().isGestureActive(item->getUUID()))
 			return true;
 		break;
+	default:
+		break;
 	}
 	return false;
 }
@@ -1469,13 +1471,14 @@ BOOL LLFolderBridge::isItemRemovable()
 	{
 		return FALSE;
 	}
+
 	// Allow protected types to be removed, but issue a warning.
-	/*
-	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+	// Restrict to god mode so users don't inadvertently mess up their inventory.
+	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()) &&
+	   !gAgent.isGodlike())
 	{
 		return FALSE;
 	}
-	*/
 
 	LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
 	LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL);
@@ -3196,6 +3199,22 @@ void LLTextureBridge::openItem()
 	}
 }
 
+bool LLTextureBridge::canSaveTexture(void)
+{
+	const LLInventoryModel* model = getInventoryModel();
+	if(!model) 
+	{
+		return false;
+	}
+	
+	const LLViewerInventoryItem *item = model->getItem(mUUID);
+	if (item)
+	{
+		return item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+	}
+	return false;
+}
+
 void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 {
 	lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
@@ -3220,6 +3239,10 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 
 		items.push_back(std::string("Texture Separator"));
 		items.push_back(std::string("Save As"));
+		if (!canSaveTexture())
+		{
+			disabled_items.push_back(std::string("Save As"));
+		}
 	}
 	hide_context_entries(menu, items, disabled_items);	
 }
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 4636c1d4cb84954d867dcddd25fff6996653d0b5..117e32c6be516de1505fd35118839555a8fc3074 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -380,6 +380,7 @@ class LLTextureBridge : public LLItemBridge
 protected:
 	LLTextureBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type) :
 		LLItemBridge(inventory, uuid), mInvType(type) {}
+	bool canSaveTexture(void);
 	LLInventoryType::EType mInvType;
 };
 
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 81b10f5a62edb9b4bc37c0d57e68597d978da86d..522edd0cb5c627bada9e3d432f38e60e32942633 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -40,6 +40,7 @@
 #include "llinventorymodel.h"	// gInventory.backgroundFetchActive()
 #include "llviewercontrol.h"
 #include "llviewerinventory.h"
+#include "llfolderview.h"
 
 // linden library includes
 #include "lltrans.h"
@@ -329,7 +330,6 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
 		mFilterSubString = string;
 		LLStringUtil::toUpper(mFilterSubString);
 		LLStringUtil::trimHead(mFilterSubString);
-
 		if (less_restrictive)
 		{
 			setModified(FILTER_LESS_RESTRICTIVE);
@@ -512,21 +512,21 @@ void LLInventoryFilter::setModified(EFilterBehavior behavior)
 		// if not keeping current filter results, update last valid as well
 		switch(mFilterBehavior)
 		{
-		case FILTER_RESTART:
-			mMustPassGeneration = mFilterGeneration;
-			mMinRequiredGeneration = mFilterGeneration;
-			break;
-		case FILTER_LESS_RESTRICTIVE:
-			mMustPassGeneration = mFilterGeneration;
-			break;
-		case FILTER_MORE_RESTRICTIVE:
-			mMinRequiredGeneration = mFilterGeneration;
-			// must have passed either current filter generation (meaningless, as it hasn't been run yet)
-			// or some older generation, so keep the value
-			mMustPassGeneration = llmin(mMustPassGeneration, mFilterGeneration);
-			break;
-		default:
-			llerrs << "Bad filter behavior specified" << llendl;
+			case FILTER_RESTART:
+				mMustPassGeneration = mFilterGeneration;
+				mMinRequiredGeneration = mFilterGeneration;
+				break;
+			case FILTER_LESS_RESTRICTIVE:
+				mMustPassGeneration = mFilterGeneration;
+				break;
+			case FILTER_MORE_RESTRICTIVE:
+				mMinRequiredGeneration = mFilterGeneration;
+				// must have passed either current filter generation (meaningless, as it hasn't been run yet)
+				// or some older generation, so keep the value
+				mMustPassGeneration = llmin(mMustPassGeneration, mFilterGeneration);
+				break;
+			default:
+				llerrs << "Bad filter behavior specified" << llendl;
 		}
 	}
 	else
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 4cbf27b7257b183286a09369815eaba8b42f5579..92b9dc427f5cc02c406ee73dde0f85147b64822b 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -903,13 +903,10 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
 	if (!auto_open) return NULL;
 	
 	// D. Open the inventory side panel and use that.
-	LLSideTray *side_tray = LLSideTray::getInstance();
+    LLSD key;
 	LLSidepanelInventory *sidepanel_inventory =
-		dynamic_cast<LLSidepanelInventory *>(side_tray->getPanel("sidepanel_inventory"));
-
-	// Use the inventory side panel only if it is already active.
-	// Activating it may unexpectedly switch off the currently active tab in some cases.
-	if (sidepanel_inventory && (LLPanel*)side_tray->getActiveTab() == (LLPanel*)sidepanel_inventory)
+		dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->showPanel("sidepanel_inventory", key));
+	if (sidepanel_inventory)
 	{
 		return sidepanel_inventory->getActivePanel();
 	}
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 9797c013711ee48ff9e7c67f95b4869776611fab..08bc1fac8b3fbbb7a8d7ac7e37b43e4db0532962 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -127,7 +127,6 @@ LLTeleportHistoryMenuItem::LLTeleportHistoryMenuItem(const Params& p)
 	if (p.item_type == TYPE_BACKWARD)
 	{
 		setFont( p.back_item_font );
-		setLabel(std::string("   ") + std::string(p.label));
 	}
 	else if (p.item_type == TYPE_CURRENT)
 	{
@@ -136,7 +135,6 @@ LLTeleportHistoryMenuItem::LLTeleportHistoryMenuItem(const Params& p)
 	else
 	{
 		setFont( p.forward_item_font );
-		setLabel(std::string("   ") + std::string(p.label));
 	}
 
 	LLIconCtrl::Params icon_params;
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 5c240aa54a367cc3c15233e3e235e345f6873b2b..83a8dcd9f075b2b6b36d6c8459e8c53c80d09802 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -265,6 +265,11 @@ class LLHandlerUtil
 	 */
 	static bool canLogToIM(const LLNotificationPtr& notification);
 
+	/**
+	 * Checks sufficient conditions to log notification message to nearby chat session.
+	 */
+	static bool canLogToNearbyChat(const LLNotificationPtr& notification);
+
 	/**
 	 * Checks sufficient conditions to spawn IM session.
 	 */
@@ -287,6 +292,11 @@ class LLHandlerUtil
 	 * Writes group notice notification message to IM  group session.
 	 */
 	static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification);
+
+	/**
+	 * Writes notification message to nearby chat.
+	 */
+	static void logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type);
 };
 
 }
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 6748bd79823757675f5c84ed49e75d9415821ff8..5b54092c5cdea3d5bcd6ff81a914490ced6afdf0 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -37,6 +37,8 @@
 #include "llnotifications.h"
 #include "llimview.h"
 #include "llagent.h"
+#include "llfloaterreg.h"
+#include "llnearbychat.h"
 
 using namespace LLNotificationsUI;
 
@@ -47,7 +49,9 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
 						ADD_FRIEND_WITH_MESSAGE("AddFriendWithMessage"),
 						USER_GIVE_ITEM("UserGiveItem"), OFFER_FRIENDSHIP("OfferFriendship"),
 						FRIENDSHIP_ACCEPTED("FriendshipAccepted"),
-						FRIENDSHIP_OFFERED("FriendshipOffered");
+						FRIENDSHIP_OFFERED("FriendshipOffered"),
+						FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"),
+						SERVER_OBJECT_MESSAGE("ServerObjectMessage");
 
 // static
 bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
@@ -55,7 +59,16 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
 	return GRANTED_MODIFY_RIGHTS == notification->getName()
 			|| REVOKED_MODIFY_RIGHTS == notification->getName()
 			|| PAYMENT_RECIVED == notification->getName()
-			|| FRIENDSHIP_OFFERED == notification->getName();
+			|| FRIENDSHIP_OFFERED == notification->getName()
+			|| SERVER_OBJECT_MESSAGE == notification->getName();
+}
+
+// static
+bool LLHandlerUtil::canLogToNearbyChat(const LLNotificationPtr& notification)
+{
+	return notification->getType() == "notifytip"
+			&&  FRIEND_ONLINE != notification->getName()
+			&& FRIEND_OFFLINE != notification->getName();
 }
 
 // static
@@ -144,3 +157,15 @@ void LLHandlerUtil::logGroupNoticeToIMGroup(
 			payload["group_id"], sender_id);
 }
 
+// static
+void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type)
+{
+	LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+	if(nearby_chat)
+	{
+		LLChat chat_msg(notification->getMessage());
+		chat_msg.mSourceType = type;
+		nearby_chat->addMessage(chat_msg);
+	}
+}
+
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 95f5ec801c454c1f382351b193cc3d450fcd8a34..9afaddae82ee0578c476e778277b3fc792364571 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -88,18 +88,17 @@ bool LLTipHandler::processNotification(const LLSD& notify)
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
 		// archive message in nearby chat
-		LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
-		if(nearby_chat)
+		if (LLHandlerUtil::canLogToNearbyChat(notification))
 		{
-			LLChat chat_msg(notification->getMessage());
-			chat_msg.mSourceType = CHAT_SOURCE_SYSTEM;
-			nearby_chat->addMessage(chat_msg);
+			LLHandlerUtil::logToNearbyChat(notification, CHAT_SOURCE_SYSTEM);
 
 			// don't show toast if Nearby Chat is opened
+			LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<
+					LLNearbyChat>("nearby_chat", LLSD());
 			if (nearby_chat->getVisible())
 			{
 				return true;
-			}			
+			}
 		}
 
 		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index eb9cb10d56476e9d5f74d0e80b0f0ec0b876b63c..b9f422ca6f6fae0878e7e3a11476fd9ad5dc5a0b 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -51,6 +51,7 @@
 #include "llfloaterworldmap.h"
 #include "llfloaterreg.h"
 #include "llnotificationsutil.h"
+#include "llvoiceclient.h"
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLDropTarget
@@ -395,6 +396,7 @@ void LLPanelProfileTab::updateButtons()
 					&& gAgent.isGodlike() || is_agent_mappable(getAvatarId());
 
 	childSetEnabled("show_on_map_btn", enable_map_btn);
+	childSetEnabled("call", LLVoiceClient::voiceEnabled());
 }
 
 //////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 2cb3967685efe2b561e77774ddff3615fdcbb8b8..fff257589381a39f76ba5364f1faab042569720a 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -90,6 +90,7 @@ LLPanelGroup::LLPanelGroup()
 :	LLPanel(),
 	LLGroupMgrObserver( LLUUID() ),
 	mAllowEdit( TRUE )
+	,mShowingNotifyDialog(false)
 {
 	// Set up the factory callbacks.
 	// Roles sub tabs
@@ -538,3 +539,69 @@ void LLPanelGroup::showNotice(const std::string& subject,
 
 }
 
+bool	LLPanelGroup::canClose()
+{
+	if(getVisible() == false)
+		return true;
+
+	bool need_save = false;
+	std::string mesg;
+	for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it)
+		if(need_save|=(*it)->needsApply(mesg))
+			break;
+	if(!need_save)
+		return false;
+	// If no message was provided, give a generic one.
+	if (mesg.empty())
+	{
+		mesg = mDefaultNeedsApplyMesg;
+	}
+	// Create a notify box, telling the user about the unapplied tab.
+	LLSD args;
+	args["NEEDS_APPLY_MESSAGE"] = mesg;
+	args["WANT_APPLY_MESSAGE"] = mWantApplyMesg;
+
+	LLNotificationsUtil::add("SaveChanges", args, LLSD(), boost::bind(&LLPanelGroup::handleNotifyCallback,this, _1, _2));
+
+	mShowingNotifyDialog = true;
+
+	return false;
+}
+
+bool	LLPanelGroup::notifyChildren(const LLSD& info)
+{
+	if(info.has("request") && mID.isNull() )
+	{
+		std::string str_action = info["request"];
+
+		if (str_action == "quit" )
+		{
+			canClose();
+			return true;
+		}
+		if(str_action == "wait_quit")
+			return mShowingNotifyDialog;
+	}
+	return false;
+}
+bool LLPanelGroup::handleNotifyCallback(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	mShowingNotifyDialog = false;
+	switch (option)
+	{
+	case 0: // "Apply Changes"
+		apply();
+		break;
+	case 1: // "Ignore Changes"
+		break;
+	case 2: // "Cancel"
+	default:
+		// Do nothing.  The user is canceling the action.
+		// If we were quitting, we didn't really mean it.
+		LLAppViewer::instance()->abortQuit();
+		break;
+	}
+	return false;
+}
+
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 306e6575fc7122a3ecfec663f8c35b6bbe873d45..f6aefdb676d85cc043262d1a7376b32e4ad124e0 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -89,7 +89,10 @@ class LLPanelGroup : public LLPanel,
 						   const std::string& inventory_name,
 						   LLOfferInfo* inventory_offer);
 
-	
+
+	bool	notifyChildren		(const LLSD& info);
+	bool	handleNotifyCallback(const LLSD&, const LLSD&);
+
 protected:
 	virtual void update(LLGroupChange gc);
 
@@ -107,6 +110,9 @@ class LLPanelGroup : public LLPanel,
 
 protected:
 	bool	apply(LLPanelGroupTab* tab);
+	bool	canClose();
+
+	bool	mShowingNotifyDialog;
 
 	LLTimer mRefreshTimer;
 
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 8c19865550a539ce28c5c3c13458e36c35ad3f85..4f76d32ad59209aa6c2fdf0cbf178a17226cc54d 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -101,14 +101,6 @@ void LLPanelChatControlPanel::draw()
 		&& callback_enabled;
 	childSetEnabled("call_btn", enable_connect);
 
-	// send a signal when the floater is fully initialized
-	// this lets LLAvatarActions::startAdhocCall() start the call
-	if (enable_connect && !mInitialized)
-	{
-		LLIMModel::sendSessionInitialized(mSessionId);
-		mInitialized = true;
-	}
-
 	LLPanel::draw();
 }
 
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 871779b2737415b7f5db56c909caaed89d981c2b..711340efc77111ad73c1616b3caae286fa958f03 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -45,8 +45,7 @@ class LLPanelChatControlPanel : public LLPanel
 {
 public:
 	LLPanelChatControlPanel() :
-		mSessionId(LLUUID()),
-		mInitialized(false) {};
+		mSessionId(LLUUID()) {};
 	~LLPanelChatControlPanel();
 
 	virtual BOOL postBuild();
@@ -63,7 +62,6 @@ class LLPanelChatControlPanel : public LLPanel
 
 private:
 	LLUUID mSessionId;
-	bool   mInitialized;
 
 	// connection to voice channel state change signal
 	boost::signals2::connection mVoiceChannelStateChangeConnection;
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index c85fab20921006a01ab0854f84034fcfe2ae38e0..e56ed00dcba05bd69a64af19f1a36a799fa365fa 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -66,6 +66,30 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn";
 
 // helper functions
 static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string);
+static void save_folder_state_if_no_filter(LLInventorySubTreePanel* inventory_list);
+
+/**
+ * Bridge to support knowing when the inventory has changed to update folder (open/close) state 
+ * for landmarks panels.
+ *
+ * Due to Inventory data are loaded in background we need to save folder state each time 
+ * next level is loaded. See EXT-3094.
+ */
+class LLLandmarksPanelObserver : public LLInventoryObserver
+{
+public:
+	LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {}
+	virtual ~LLLandmarksPanelObserver() {}
+	/*virtual*/ void changed(U32 mask);
+
+private:
+	LLLandmarksPanel* mLP;
+};
+
+void LLLandmarksPanelObserver::changed(U32 mask)
+{
+	mLP->saveFolderStateIfNoFilter();
+}
 
 LLLandmarksPanel::LLLandmarksPanel()
 	:	LLPanelPlacesTab()
@@ -78,11 +102,18 @@ LLLandmarksPanel::LLLandmarksPanel()
 	,	mGearFolderMenu(NULL)
 	,	mGearLandmarkMenu(NULL)
 {
+	mInventoryObserver = new LLLandmarksPanelObserver(this);
+	gInventory.addObserver(mInventoryObserver);
+
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml");
 }
 
 LLLandmarksPanel::~LLLandmarksPanel()
 {
+	if (gInventory.containsObserver(mInventoryObserver))
+	{
+		gInventory.removeObserver(mInventoryObserver);
+	}
 }
 
 BOOL LLLandmarksPanel::postBuild()
@@ -226,6 +257,14 @@ void LLLandmarksPanel::onSelectorButtonClicked()
 	}
 }
 
+void LLLandmarksPanel::saveFolderStateIfNoFilter()
+{
+	save_folder_state_if_no_filter(mFavoritesInventoryPanel);
+	save_folder_state_if_no_filter(mLandmarksInventoryPanel);
+	save_folder_state_if_no_filter(mMyInventoryPanel);
+	save_folder_state_if_no_filter(mLibraryInventoryPanel);
+}
+
 //////////////////////////////////////////////////////////////////////////
 // PROTECTED METHODS
 //////////////////////////////////////////////////////////////////////////
@@ -328,6 +367,7 @@ void LLLandmarksPanel::initFavoritesInventoryPanel()
 
 	initLandmarksPanel(mFavoritesInventoryPanel);
 	mFavoritesInventoryPanel->getFilter()->setEmptyLookupMessage("FavoritesNoMatchingItems");
+
 	initAccordion("tab_favorites", mFavoritesInventoryPanel);
 }
 
@@ -389,6 +429,7 @@ void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_lis
 	}
 
 	root_folder->setParentLandmarksPanel(this);
+	inventory_list->saveFolderState();
 }
 
 void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list)
@@ -743,7 +784,7 @@ void LLLandmarksPanel::updateFilteredAccordions()
 {
 	LLInventoryPanel* inventory_list = NULL;
 	LLAccordionCtrlTab* accordion_tab = NULL;
-//	bool needs_arrange = false;
+	bool needs_arrange = false;
 
 	for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
 	{
@@ -755,7 +796,7 @@ void LLLandmarksPanel::updateFilteredAccordions()
 		if (NULL == inventory_list) continue;
 
 		// This doesn't seem to work correctly.  Disabling for now. -Seraph
-		/*
+		// Enabled to show/hide accordions with/without landmarks. See EXT-2346. (Seth PE)
 		LLFolderView* fv = inventory_list->getRootFolder();
 
 		// arrange folder view contents to draw its descendants if it has any
@@ -766,17 +807,17 @@ void LLLandmarksPanel::updateFilteredAccordions()
 			needs_arrange = true;
 
 		accordion_tab->setVisible(has_descendants);
-		*/
-		accordion_tab->setVisible(TRUE);
+
+		//accordion_tab->setVisible(TRUE);
 	}
 
 	// we have to arrange accordion tabs for cases when filter string is less restrictive but
 	// all items are still filtered.
-//	if (needs_arrange)
-//	{
+	if (needs_arrange)
+	{
 		static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
 		accordion->arrange();
-//	}
+	}
 }
 
 /*
@@ -991,23 +1032,41 @@ void LLLandmarksPanel::doCreatePick(LLLandmark* landmark)
 //////////////////////////////////////////////////////////////////////////
 static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string)
 {
-	// Open the immediate children of the root folder, since those
-	// are invisible in the UI and thus must always be open.
-	inventory_list->getRootFolder()->openTopLevelFolders();
-
+	// When search is cleared, restore the old folder state.
 	if (string == "")
 	{
 		inventory_list->setFilterSubString(LLStringUtil::null);
+		// Re-open folders that were open before
+		inventory_list->restoreFolderState();
 	}
 
+	// Open the immediate children of the root folder, since those
+	// are invisible in the UI and thus must always be open.
+	inventory_list->getRootFolder()->openTopLevelFolders();
+
 	if (inventory_list->getFilterSubString().empty() && string.empty())
 	{
 		// current filter and new filter empty, do nothing
 		return;
 	}
 
+	// save current folder open state if no filter currently applied
+	if (inventory_list->getRootFolder()->getFilterSubString().empty())
+	{
+		inventory_list->saveFolderState();
+	}
+
 	// Set new filter string
 	inventory_list->setFilterSubString(string);
 
 }
+
+static void save_folder_state_if_no_filter(LLInventorySubTreePanel* inventory_list)
+{
+	// save current folder open state if no filter currently applied
+	if (inventory_list->getRootFolder() && inventory_list->getRootFolder()->getFilterSubString().empty())
+	{
+		// inventory_list->saveFolderState(); // *TODO: commented out to fix build
+	}
+}
 // EOF
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index bee141d05168a014394a19b761644c68b5e8f704..b0e537f647174ae33681df9d6dfb08a8508f49ff 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -67,6 +67,11 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 		mCurrentSelectedList = inventory_list;
 	}
 
+	/**
+	 * Saves folder state for all Inventory Panels if there are no applied filter.
+	 */
+	void saveFolderStateIfNoFilter();
+
 protected:
 	/**
 	 * @return true - if current selected panel is not null and selected item is a landmark
@@ -151,6 +156,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	LLMenuGL*					mGearFolderMenu;
 	LLMenuGL*					mMenuAdd;
 	LLInventorySubTreePanel*	mCurrentSelectedList;
+	LLInventoryObserver*		mInventoryObserver;
 
 	LLPanel*					mListCommands;
 	bool 						mSortByDate;
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index a729b8c06ffc994088db83c309753d005797b305..a5bfa18851f3f0cae3ef51b6b501f1db78983e80 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -73,6 +73,11 @@
 #include "llfloatertos.h"
 #include "lltrans.h"
 #include "llglheaders.h"
+#include "llpanelloginlistener.h"
+
+#if LL_WINDOWS
+#pragma warning(disable: 4355)      // 'this' used in initializer list
+#endif  // LL_WINDOWS
 
 #define USE_VIEWER_AUTH 0
 
@@ -166,7 +171,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	mLogoImage(),
 	mCallback(callback),
 	mCallbackData(cb_data),
-	mHtmlAvailable( TRUE )
+	mHtmlAvailable( TRUE ),
+	mListener(new LLPanelLoginListener(this))
 {
 	setFocusRoot(TRUE);
 
@@ -452,7 +458,7 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask)
 	if ( KEY_F1 == key )
 	{
 		LLViewerHelp* vhelp = LLViewerHelp::getInstance();
-		vhelp->showTopic(vhelp->getTopicFromFocus());
+		vhelp->showTopic(vhelp->f1HelpTopic());
 		return TRUE;
 	}
 
@@ -972,7 +978,7 @@ void LLPanelLogin::onClickHelp(void*)
 	if (sInstance)
 	{
 		LLViewerHelp* vhelp = LLViewerHelp::getInstance();
-		vhelp->showTopic(vhelp->getTopicFromFocus());
+		vhelp->showTopic(vhelp->preLoginTopic());
 	}
 }
 
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index e3d30d7d0c028892e9ee553f6506e58abc08dfac..97350ce5c72a09654abb1145c0e3039bb7ef8f4d 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -36,10 +36,11 @@
 #include "llpanel.h"
 #include "llpointer.h"			// LLPointer<>
 #include "llmediactrl.h"	// LLMediaCtrlObserver
+#include <boost/scoped_ptr.hpp>
 
 class LLLineEditor;
 class LLUIImage;
-
+class LLPanelLoginListener;
 
 class LLPanelLogin:	
 	public LLPanel,
@@ -90,6 +91,7 @@ class LLPanelLogin:
 	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
 
 private:
+	friend class LLPanelLoginListener;
 	void reshapeBrowser();
 	static void onClickConnect(void*);
 	static void onClickNewAccount(void*);
@@ -103,6 +105,7 @@ class LLPanelLogin:
 	
 private:
 	LLPointer<LLUIImage> mLogoImage;
+	boost::scoped_ptr<LLPanelLoginListener> mListener;
 
 	void			(*mCallback)(S32 option, void *userdata);
 	void*			mCallbackData;
diff --git a/indra/newview/llpanelloginlistener.cpp b/indra/newview/llpanelloginlistener.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f7e59aaf54c6abaef7a710b6109daa0c25d201c5
--- /dev/null
+++ b/indra/newview/llpanelloginlistener.cpp
@@ -0,0 +1,34 @@
+/**
+ * @file   llpanelloginlistener.cpp
+ * @author Nat Goodspeed
+ * @date   2009-12-10
+ * @brief  Implementation for llpanelloginlistener.
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llpanelloginlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llpanellogin.h"
+
+LLPanelLoginListener::LLPanelLoginListener(LLPanelLogin* instance):
+    LLEventAPI("LLPanelLogin", "Access to LLPanelLogin methods"),
+    mPanel(instance)
+{
+    add("onClickConnect",
+        "Pretend user clicked the \"Log In\" button",
+        &LLPanelLoginListener::onClickConnect);
+}
+
+void LLPanelLoginListener::onClickConnect(const LLSD&) const
+{
+    mPanel->onClickConnect(NULL);
+}
diff --git a/indra/newview/llpanelloginlistener.h b/indra/newview/llpanelloginlistener.h
new file mode 100644
index 0000000000000000000000000000000000000000..0a56c75422d345f6ea73713abe34a53008ec48d6
--- /dev/null
+++ b/indra/newview/llpanelloginlistener.h
@@ -0,0 +1,30 @@
+/**
+ * @file   llpanelloginlistener.h
+ * @author Nat Goodspeed
+ * @date   2009-12-10
+ * @brief  LLEventAPI for LLPanelLogin
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLPANELLOGINLISTENER_H)
+#define LL_LLPANELLOGINLISTENER_H
+
+#include "lleventapi.h"
+class LLPanelLogin;
+class LLSD;
+
+class LLPanelLoginListener: public LLEventAPI
+{
+public:
+    LLPanelLoginListener(LLPanelLogin* instance);
+
+private:
+    void onClickConnect(const LLSD&) const;
+
+    LLPanelLogin* mPanel;
+};
+
+#endif /* ! defined(LL_LLPANELLOGINLISTENER_H) */
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 21627e84ff2cadcff30bfb994b3eb53b2517030d..cef21e85d6d584593b0115e4e740771e4eaca013 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -33,6 +33,7 @@
 #include "llviewerprecompiledheaders.h"
 #include "llpanelmaininventory.h"
 
+#include "llagent.h"
 #include "lldndbutton.h"
 #include "llfilepicker.h"
 #include "llfloaterinventory.h"
@@ -863,7 +864,6 @@ void LLPanelMainInventory::initListCommandsHandlers()
 	mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
 	mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-	
 }
 
 void LLPanelMainInventory::updateListCommands()
@@ -909,6 +909,22 @@ void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
 	getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
 }
 
+void LLPanelMainInventory::saveTexture(const LLSD& userdata)
+{
+	LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+	if (!current_item)
+	{
+		return;
+	}
+	
+	const LLUUID& item_id = current_item->getListener()->getUUID();
+	LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
+	if (preview_texture)
+	{
+		preview_texture->openToSave();
+	}
+}
+
 void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
 {
 	if (!isActionEnabled(userdata))
@@ -953,18 +969,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
 	}
 	if (command_name == "save_texture")
 	{
-		LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
-		if (!current_item)
-		{
-			return;
-		}
-
-		const LLUUID& item_id = current_item->getListener()->getUUID();
-		LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
-		if (preview_texture)
-		{
-			preview_texture->openToSave();
-		}
+		saveTexture(userdata);
 	}
 	// This doesn't currently work, since the viewer can't change an assetID an item.
 	if (command_name == "regenerate_link")
@@ -1008,6 +1013,22 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
 	}
 }
 
+bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
+{
+	LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+	if (current_item) 
+	{
+		LLViewerInventoryItem *inv_item = current_item->getInventoryItem();
+		if(inv_item)
+		{
+			bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+			LLInventoryType::EType curr_type = current_item->getListener()->getInventoryType();
+			return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT);
+		}
+	}
+	return false;
+}
+
 BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
 {
 	const std::string command_name = userdata.asString();
@@ -1035,12 +1056,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
 	}
 	if (command_name == "save_texture")
 	{
-		LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
-		if (current_item)
-		{
-			return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE);
-		}
-		return FALSE;
+		return isSaveTextureEnabled(userdata);
 	}
 	if (command_name == "find_original")
 	{
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index ae78d3bec82b0d1195c957b142fe4594596f8377..92443df369b28070a536c1432011b455895ed42c 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -110,6 +110,8 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 	void doCreate(const LLSD& userdata);
 	void resetFilters();
 	void setSortBy(const LLSD& userdata);
+	void saveTexture(const LLSD& userdata);
+	bool isSaveTextureEnabled(const LLSD& userdata);
 	
 private:
 	LLFloaterInventoryFinder* getFinder();
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 4f8aff6f781d7baab9ad96b5d9d0aff5256f70f7..43366ef8140304d383608406cee5c4cc521b10bd 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -157,7 +157,7 @@ LLInventoryItem* LLTaskInvFVBridge::findItem() const
 	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
 	if(object)
 	{
-		return (LLInventoryItem*)(object->getInventoryObject(mUUID));
+		return dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID));
 	}
 	return NULL;
 }
@@ -712,6 +712,7 @@ class LLTaskCategoryBridge : public LLTaskInvFVBridge
 	virtual LLUIImagePtr getIcon() const;
 	virtual const std::string& getDisplayName() const { return getName(); }
 	virtual BOOL isItemRenameable() const;
+	// virtual BOOL isItemCopyable() const { return FALSE; }
 	virtual BOOL renameItem(const std::string& new_name);
 	virtual BOOL isItemRemovable();
 	virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
@@ -1697,7 +1698,7 @@ void LLPanelObjectInventory::updateInventory()
 
 	mFolders->requestArrange();
 	mInventoryNeedsUpdate = FALSE;
-	LLEditMenuHandler::gEditMenuHandler = mFolders;
+	// Edit menu handler is set in onFocusReceived
 }
 
 // *FIX: This is currently a very expensive operation, because we have
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 1e4682701e7124f1542b1cd4d85cc1d0a52ea072..5fb7dab7be9267fe6d9fbd546bcd4e4437cf3557 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -775,7 +775,7 @@ void LLPanelPeople::updateButtons()
 	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
 	buttonSetEnabled("view_profile_btn",	item_selected);
 	buttonSetEnabled("im_btn",				multiple_selected); // allow starting the friends conference for multiple selection
-	buttonSetEnabled("call_btn",			multiple_selected);
+	buttonSetEnabled("call_btn",			multiple_selected && LLVoiceClient::voiceEnabled());
 	buttonSetEnabled("share_btn",			item_selected); // not implemented yet
 
 	bool none_group_selected = item_selected && selected_id.isNull();
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 57f3d86d539ca6c1522428c263c0e9425156667d..04fe42de9f9840d006ecbeb5f3ebf1aa79154f08 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -100,7 +100,7 @@ LLContextMenu* NearbyMenu::createMenu()
 		registrar.add("Avatar.Call",			boost::bind(&LLAvatarActions::startCall,				id));
 		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.Share",			boost::bind(&LLAvatarActions::share,					id));
 		registrar.add("Avatar.Pay",				boost::bind(&LLAvatarActions::pay,						id));
 		registrar.add("Avatar.BlockUnblock",	boost::bind(&LLAvatarActions::toggleBlock,				id));
 
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index f7f3c5830d5691537d06aadddf9c6712b0f33986..e21eb01da341ce4e884a077756daa964e703ef66 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -278,12 +278,20 @@ void LLPanelPlaces::onOpen(const LLSD& key)
 	}
 	else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
 	{
-		mPosGlobal = LLVector3d(key["x"].asReal(),
-								key["y"].asReal(),
-								key["z"].asReal());
+		if (key.has("id"))
+		{
+			LLUUID parcel_id = key["id"].asUUID();
+			mPlaceProfile->setParcelID(parcel_id);
+		}
+		else
+		{
+			mPosGlobal = LLVector3d(key["x"].asReal(),
+									key["y"].asReal(),
+									key["z"].asReal());
+			mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+		}
 
 		mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
-		mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
 	}
 	else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
 	{
@@ -854,6 +862,7 @@ void LLPanelPlaces::updateVerbs()
 	mCancelBtn->setVisible(isLandmarkEditModeOn);
 	mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
 
+	mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn);
 	mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible);
 
 	if (is_place_info_visible)
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 13f195a1bea447ad429d927f5e741be451c04f72..48a7a32a3b1c7b80111b7649c1884b7f809d01c8 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -278,6 +278,16 @@ void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_lis
 //
 bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
 {
+	/**
+	 * We need to filter speaking objects. These objects shouldn't appear in the list
+	 * @c LLFloaterChat::addChat() in llviewermessage.cpp to get detailed call hierarchy
+	 */
+	const LLUUID& speaker_id = event->getValue().asUUID();
+	LLPointer<LLSpeaker> speaker = mParent.mSpeakerMgr->findSpeaker(speaker_id);
+	if(speaker.isNull() || speaker->mType == LLSpeaker::SPEAKER_OBJECT)
+	{
+		return false;
+	}
 	return mParent.onAddItemEvent(event, userdata);
 }
 
@@ -314,6 +324,8 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
 	registrar.add("ParticipantList.ToggleAllowTextChat", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleAllowTextChat, this, _2));
 	registrar.add("ParticipantList.ToggleMuteText", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteText, this, _2));
 
+	registrar.add("ParticipantList.ModerateVoice", boost::bind(&LLParticipantList::LLParticipantListMenu::moderateVoice, this, _2));
+
 	enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem,	this, _2));
 	enable_registrar.add("ParticipantList.CheckItem",  boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem,	this, _2));
 
@@ -322,6 +334,28 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
 		"menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
 }
 
+void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
+{
+	LLPanelPeopleMenus::ContextMenu::show(spawning_view, uuids, x, y);
+
+	if (uuids.size() == 0) return;
+
+	const LLUUID speaker_id = mUUIDs.front();
+	BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagVoiceChat);
+
+	if (is_muted)
+	{
+		LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteSelected", false);
+		LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteOthers", false);
+	}
+	else
+	{
+		LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false);
+		LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false);
+	}
+
+}
+
 void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata)
 {
 	const LLUUID speaker_id = mUUIDs.front();
@@ -379,10 +413,10 @@ void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& u
 		new MuteTextResponder(mParent.mSpeakerMgr->getSessionID()));
 }
 
-void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata)
+void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata, U32 flags)
 {
 	const LLUUID speaker_id = mUUIDs.front();
-	BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagTextChat);
+	BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, flags);
 	std::string name;
 
 	//fill in name using voice client's copy of name cache
@@ -398,12 +432,54 @@ void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userda
 
 	if (!is_muted)
 	{
-		LLMuteList::getInstance()->add(mute, LLMute::flagTextChat);
+		LLMuteList::getInstance()->add(mute, flags);
 	}
 	else
 	{
-		LLMuteList::getInstance()->remove(mute, LLMute::flagTextChat);
+		LLMuteList::getInstance()->remove(mute, flags);
+	}
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata)
+{
+	toggleMute(userdata, LLMute::flagTextChat);
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleMuteVoice(const LLSD& userdata)
+{
+	toggleMute(userdata, LLMute::flagVoiceChat);
+}
+
+void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdata)
+{
+
+}
+void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLSD& userdata)
+{
+	LLSpeakerMgr::speaker_list_t speakers;
+	mParent.mSpeakerMgr->getSpeakerList(&speakers, true);
+
+	const LLUUID& excluded_avatar_id = mUUIDs.front();
+	bool should_mute = userdata.asString() == "mute";
+	for (LLSpeakerMgr::speaker_list_t::iterator iter = speakers.begin();
+		iter != speakers.end(); ++iter)
+	{
+		LLSpeaker* speakerp = (*iter).get();
+		LLUUID speaker_id = speakerp->mID;
+		if (excluded_avatar_id == speaker_id) continue;
+
+		LLMute mute(speaker_id, speakerp->mDisplayName, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT);
+
+		if (should_mute)
+		{
+			LLMuteList::getInstance()->add(mute, LLMute::flagVoiceChat);
+		}
+		else
+		{
+			LLMuteList::getInstance()->remove(mute, LLMute::flagVoiceChat);
+		}
 	}
+
 }
 
 bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata)
@@ -414,7 +490,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD&
 		return mUUIDs.front() != gAgentID;
 	}
 	else
-		if (item == "can_allow_text_chat")
+		if (item == "can_allow_text_chat" || "can_moderate_voice" == item)
 		{
 			LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mParent.mSpeakerMgr->getSessionID());
 			return im_session->mType == IM_SESSION_GROUP_START && mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator;
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 86b38f5f1e832148b6a3360243c78995ebed6c6c..83191a5b8d0b682dd673b821a399bc5728c89574 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -117,6 +117,7 @@ class LLParticipantList
 		public:
 			LLParticipantListMenu(LLParticipantList& parent):mParent(parent){};
 			/*virtual*/ LLContextMenu* createMenu();
+			/*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y);
 		protected:
 			LLParticipantList& mParent;
 		private:
@@ -124,8 +125,13 @@ class LLParticipantList
 			bool checkContextMenuItem(const LLSD& userdata);
 
 			void toggleAllowTextChat(const LLSD& userdata);
+			void toggleMute(const LLSD& userdata, U32 flags);
 			void toggleMuteText(const LLSD& userdata);
+			void toggleMuteVoice(const LLSD& userdata);
 		
+			// Voice moderation support
+			void moderateVoice(const LLSD& userdata);
+			void moderateVoiceOtherParticipants(const LLSD& userdata);
 		};
 
 	private:
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 0362fdbf56014d31197657443577c870ce5aea6f..8d8031076909abe9e07e43e3c59f684d712a0d8d 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -54,6 +54,7 @@
 #include "llscrolllistcell.h"
 #include "llslider.h"
 #include "lscript_rt_interface.h"
+#include "lscript_library.h"
 #include "lscript_export.h"
 #include "lltextbox.h"
 #include "lltooldraganddrop.h"
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 698f6152b4ade605720148bd8f1b82fcc50e24ba..26694ac433cf03b3b8dc7de93b1741d510bdc838 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -76,29 +76,12 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)
 	  mAspectRatio(0.f),
 	  mPreviewToSave(FALSE)
 {
-	const LLInventoryItem *item = getItem();
+	const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
 	if(item)
 	{
 		mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID();
 		mImageID = item->getAssetUUID();
-		const LLPermissions& perm = item->getPermissions();
-		U32 mask = PERM_NONE;
-		if(perm.getOwner() == gAgent.getID())
-		{
-			mask = perm.getMaskBase();
-		}
-		else if(gAgent.isInGroup(perm.getGroup()))
-		{
-			mask = perm.getMaskGroup();
-		}
-		else
-		{
-			mask = perm.getMaskEveryone();
-		}
-		if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
-		{
-			mIsCopyable = TRUE;
-		}
+		mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
 	}
 	else // not an item, assume it's an asset id
 	{
@@ -145,6 +128,9 @@ BOOL LLPreviewTexture::postBuild()
 		childSetVisible("Discard", false);
 	}
 	
+	childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this);
+	childSetVisible("save_tex_btn", canSaveAs());
+	
 	if (!mCopyToInv) 
 	{
 		const LLInventoryItem* item = getItem();
@@ -164,6 +150,13 @@ BOOL LLPreviewTexture::postBuild()
 	return LLPreview::postBuild();
 }
 
+// static
+void LLPreviewTexture::onSaveAsBtn(void* data)
+{
+	LLPreviewTexture* self = (LLPreviewTexture*)data;
+	self->saveAs();
+}
+
 void LLPreviewTexture::draw()
 {
 	if (mUpdateDimensions)
@@ -576,6 +569,7 @@ void LLPreviewTexture::loadAsset()
 	mImage->forceToSaveRawImage(0) ;
 	mAssetStatus = PREVIEW_ASSET_LOADING;
 	updateDimensions();
+	childSetVisible("save_tex_btn", canSaveAs());
 }
 
 LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index 9b3c91d831253fff05ffe91cbbc67bd20dfbdeb7..980aecee6d63f8a3b9d946a156377da37b119d55 100644
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -58,7 +58,6 @@ class LLPreviewTexture : public LLPreview
 	virtual void		reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 	virtual void 		onFocusReceived();
 	
-	static void			saveToFile(void* userdata);
 	static void			onFileLoadedForSave( 
 							BOOL success,
 							LLViewerFetchedTexture *src_vi,
@@ -68,6 +67,8 @@ class LLPreviewTexture : public LLPreview
 							BOOL final,
 							void* userdata );
 	void 				openToSave();
+	
+	static void			onSaveAsBtn(void* data);
 protected:
 	void				init();
 	/* virtual */ BOOL	postBuild();
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 4f0c873c616a97f08fd399081f4acd0af9e7ba87..f66f725070a68199dc1877d773ebb8adc4c04fe9 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -78,6 +78,22 @@ LLScreenChannelBase::~LLScreenChannelBase()
 {
 	mWorldViewRectConnection.disconnect();
 }
+
+bool  LLScreenChannelBase::isHovering()
+{
+	bool res = mHoveredToast != NULL;
+	if (!res)
+	{
+		return res;
+	}
+
+	S32 x, y;
+	mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
+			gViewerWindow->getCurrentMouseY(), &x, &y);
+	res = mHoveredToast->pointInView(x, y) == TRUE;
+	return res;
+}
+
 void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
 {
 	S32 top_delta = old_world_rect.mTop - new_world_rect.mTop;
@@ -125,6 +141,8 @@ LLScreenChannelBase(id)
 void LLScreenChannel::init(S32 channel_left, S32 channel_right)
 {
 	LLScreenChannelBase::init(channel_left, channel_right);
+	LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
+	updatePositionAndSize(world_rect, world_rect);
 }
 
 //--------------------------------------------------------------------------
@@ -136,7 +154,23 @@ LLScreenChannel::~LLScreenChannel()
 //--------------------------------------------------------------------------
 void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
 {
-	LLScreenChannelBase::updatePositionAndSize(old_world_rect, new_world_rect);
+	S32 right_delta = old_world_rect.mRight - new_world_rect.mRight;
+	LLRect this_rect = getRect();
+
+	this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
+	switch(mChannelAlignment)
+	{
+	case CA_LEFT :
+		break;
+	case CA_CENTRE :
+		this_rect.setCenterAndSize(new_world_rect.getWidth() / 2, new_world_rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight());
+		break;
+	case CA_RIGHT :
+		this_rect.mLeft -= right_delta;
+		this_rect.mRight -= right_delta;
+	}
+	setRect(this_rect);
+	redrawToasts();
 }
 
 //--------------------------------------------------------------------------
@@ -169,6 +203,7 @@ void LLScreenChannel::addToast(const LLToast::Params& p)
 	if(show_toast)
 	{
 		mToastList.push_back(new_toast_elem);
+		updateShowToastsState();
 		redrawToasts();
 	}	
 	else // store_toast
@@ -224,6 +259,7 @@ void LLScreenChannel::deleteToast(LLToast* toast)
 	if(mHoveredToast == toast)
 	{
 		mHoveredToast  = NULL;
+		startFadingToasts();
 	}
 
 	// close the toast
@@ -405,26 +441,27 @@ void LLScreenChannel::showToastsBottom()
 		{
 			if( it != mToastList.rend()-1)
 			{
-				stop_showing_toasts = ((*it).toast->getRect().mTop + gSavedSettings.getS32("OverflowToastHeight") + gSavedSettings.getS32("ToastGap")) > getRect().mTop;
+				S32 toast_top = (*it).toast->getRect().mTop + gSavedSettings.getS32("ToastGap");
+				stop_showing_toasts = toast_top > getRect().mTop;
 			}
 		} 
 
+		// at least one toast should be visible
+		if(it == mToastList.rbegin())
+		{
+			stop_showing_toasts = false;
+		}
+
 		if(stop_showing_toasts)
 			break;
 
 		if( !(*it).toast->getVisible() )
 		{
-			if((*it).toast->isFirstLook())
-			{
-				(*it).toast->setVisible(TRUE);
-			}
-			else
-			{
-				// HACK
-				// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
-				(*it).toast->setVisible(TRUE);
-				gFloaterView->sendChildToBack((*it).toast);
-			}
+			// HACK
+			// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
+			(*it).toast->setVisible(TRUE);
+			// Show toast behind floaters. (EXT-3089)
+			gFloaterView->sendChildToBack((*it).toast);
 		}		
 	}
 
@@ -566,6 +603,21 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
 	mStartUpToastPanel->setVisible(TRUE);
 }
 
+// static --------------------------------------------------------------------------
+F32 LLScreenChannel::getHeightRatio()
+{
+	F32 ratio = gSavedSettings.getF32("NotificationChannelHeightRatio");
+	if(0.0f > ratio)
+	{
+		ratio = 0.0f;
+	}
+	else if(1.0f < ratio)
+	{
+		ratio = 1.0f;
+	}
+	return ratio;
+}
+
 //--------------------------------------------------------------------------
 void LLScreenChannel::updateStartUpString(S32 num)
 {
@@ -608,7 +660,7 @@ void LLNotificationsUI::LLScreenChannel::startFadingToasts()
 	if (!mToastList.size()) return;
 
 	//because onMouseLeave is processed after onMouseEnter
-	if (mHoveredToast) return;
+	if (isHovering()) return;
 
 	std::vector<ToastElem>::iterator it = mToastList.begin();
 	while (it != mToastList.end())
@@ -685,39 +737,28 @@ void LLScreenChannel::removeToastsBySessionID(LLUUID id)
 //--------------------------------------------------------------------------
 void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 {
-	// because of LLViewerWindow::updateUI() that ALWAYS calls onMouseEnter BEFORE onMouseLeave
-	// we must check this to prevent incorrect setting for hovering in a channel
-	std::map<LLToast*, bool>::iterator it_first, it_second;
-	S32 stack_size = mToastEventStack.size();
-	if(mouse_enter)
-	{
-		mHoveredToast = toast;
-	}
-	else
+	// because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave
+	// we must check hovering directly to prevent incorrect setting for hovering in a channel
+	S32 x,y;
+	if (mouse_enter)
 	{
-		mHoveredToast = NULL;
-	}
-
-	switch(stack_size)
-	{
-	case 0:
-		mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter));
-		break;
-	case 1:
-		it_first = mToastEventStack.begin();
-		if((*it_first).second && !mouse_enter && ((*it_first).first != toast) )
+		toast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
+				gViewerWindow->getCurrentMouseY(), &x, &y);
+		bool hover = toast->pointInView(x, y) == TRUE;
+		if (hover)
 		{
-			mToastEventStack.clear();
 			mHoveredToast = toast;
 		}
-		else
+	}
+	else if (mHoveredToast != NULL)
+	{
+		mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
+				gViewerWindow->getCurrentMouseY(), &x, &y);
+		bool hover = mHoveredToast->pointInView(x, y) == TRUE;
+		if (!hover)
 		{
-			mToastEventStack.clear();
-			mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter));
+			mHoveredToast = NULL;
 		}
-		break;
-	default:
-		LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl;
 	}
 
 	if(!isHovering())
@@ -727,7 +768,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 //--------------------------------------------------------------------------
 void LLScreenChannel::updateShowToastsState()
 {
-	LLFloater* floater = LLDockableFloater::getInstanceHandle().get();
+	LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
 
 	if(!floater)
 	{
@@ -735,27 +776,17 @@ void LLScreenChannel::updateShowToastsState()
 		return;
 	}
 
-	// for IM floaters showed in a docked state - prohibit showing of ani toast
-	if(dynamic_cast<LLIMFloater*>(floater)
-		|| dynamic_cast<LLScriptFloater*>(floater) )
-	{
-		setShowToasts(!(floater->getVisible() && floater->isDocked()));
-		if (!getShowToasts())
-		{
-			removeAndStoreAllStorableToasts();
-		}
-	}
-
 	// *TODO: mantipov: what we have to do with derived classes: LLNotificationWellWindow & LLIMWelWindow?
 	// See EXT-3081 for details
 	// for Message Well floater showed in a docked state - adjust channel's height
-	if(dynamic_cast<LLSysWellWindow*>(floater))
+	if(dynamic_cast<LLSysWellWindow*>(floater) || dynamic_cast<LLIMFloater*>(floater))
 	{
 		S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
 		LLRect this_rect = getRect();
 		if(floater->getVisible() && floater->isDocked())
 		{
-			channel_bottom += (floater->getRect().getHeight() + gSavedSettings.getS32("ToastGap"));
+			channel_bottom += floater->getRect().getHeight();
+			channel_bottom += floater->getDockControl()->getTongueHeight();
 		}
 
 		if(channel_bottom != this_rect.mBottom)
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index 67f1c9bdc66938948d5b99e382553b211a80dd02..b8efbb148f1478ab49e9fcf445df348f1e6347d5 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -95,7 +95,7 @@ class LLScreenChannelBase : public LLUICtrl
 	virtual void setControlHovering(bool control) { mControlHovering = control; }
 	
 
-	bool isHovering() { return mHoveredToast != NULL; }
+	bool isHovering();
 
 	void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
 
@@ -265,6 +265,11 @@ class LLScreenChannel : public LLScreenChannelBase
 	// create the StartUp Toast
 	void	createStartUpToast(S32 notif_num, F32 timer);
 
+	/**
+	 * Notification channel and World View ratio(0.0 - always show 1 notification, 1.0 - max ratio).
+	 */
+	static F32 getHeightRatio();
+
 	// Channel's flags
 	static bool	mWasStartUpToastShown;
 
@@ -274,7 +279,6 @@ class LLScreenChannel : public LLScreenChannelBase
 
 	std::vector<ToastElem>		mToastList;
 	std::vector<ToastElem>		mStoredToastList;
-	std::map<LLToast*, bool>	mToastEventStack;
 };
 
 }
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 8de99a48aa5c1433bd4ca61af7112d3f72e41b4e..5c4f6e88603c9e0cc26624e54a03af284b8bfd5a 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -39,6 +39,7 @@
 #include "llfloaterreg.h"
 #include "llnotifications.h"
 #include "llscreenchannel.h"
+#include "llsyswellwindow.h"
 #include "lltoastnotifypanel.h"
 #include "llviewerwindow.h"
 #include "llimfloater.h"
@@ -240,6 +241,14 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
 		LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id);
 	}
 
+	LLIMWellWindow::getInstance()->addObjectRow(object_id, set_new_message);
+
+	LLSD data;
+	data["object_id"] = object_id;
+	data["new_message"] = set_new_message;
+	data["unread"] = 1; // each object has got only one floater
+	mNewObjectSignal(data);
+
 	toggleScriptFloater(object_id, set_new_message);
 }
 
@@ -267,6 +276,8 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
 	// remove related chiclet
 	LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id);
 
+	LLIMWellWindow::getInstance()->removeObjectRow(object_id);
+
 	// close floater
 	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
 	if(floater)
@@ -291,13 +302,6 @@ void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_i
 
 void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool set_new_message)
 {
-	// hide "new message" icon from chiclet
-	LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id);
-	if(chiclet)
-	{
-		chiclet->setShowNewMessagesIcon(set_new_message);
-	}
-
 	// kill toast
 	using namespace LLNotificationsUI;
 	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
@@ -307,6 +311,11 @@ void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool s
 		channel->killToastByNotificationID(findNotificationToastId(object_id));
 	}
 
+	LLSD data;
+	data["object_id"] = object_id;
+	data["new_message"] = set_new_message;
+	mToggleFloaterSignal(data);
+
 	// toggle floater
 	LLScriptFloater::toggle(object_id);
 }
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index 8de7a28d0fc5fdedbf5c20d055abadc8973e9a5b..95ec5a4d9cda0089720aeb48858bd674d1c5f92d 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -88,6 +88,11 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
 	*/
 	static void onToastButtonClick(const LLSD&notification, const LLSD&response);
 
+	typedef boost::signals2::signal<void(const LLSD&)> object_signal_t;
+
+	boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }
+	boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); }
+
 private:
 
 	struct LLNotificationData
@@ -100,6 +105,9 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
 	typedef std::map<LLUUID, LLNotificationData> script_notification_map_t;
 
 	script_notification_map_t mNotifications;
+
+	object_signal_t mNewObjectSignal;
+	object_signal_t mToggleFloaterSignal;
 };
 
 /**
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 1605838b94943c168aa42ba592305c3fa27bc9b0..44930f03c5edad758d4c69255106a1f8bf8f0951 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -104,6 +104,7 @@ const F32 SILHOUETTE_UPDATE_THRESHOLD_SQUARED = 0.02f;
 const S32 MAX_ACTION_QUEUE_SIZE = 20;
 const S32 MAX_SILS_PER_FRAME = 50;
 const S32 MAX_OBJECTS_PER_PACKET = 254;
+const S32 TE_SELECT_MASK_ALL = 0xFFFFFFFF;
 
 //
 // Globals
@@ -5110,7 +5111,7 @@ LLSelectNode::~LLSelectNode()
 
 void LLSelectNode::selectAllTEs(BOOL b)
 {
-	mTESelectMask = b ? 0xFFFFFFFF : 0x0;
+	mTESelectMask = b ? TE_SELECT_MASK_ALL : 0x0;
 	mLastTESelected = 0;
 }
 
@@ -5753,8 +5754,22 @@ void LLSelectMgr::redo()
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::canDoDelete() const
 {
+	bool can_delete = false;
+	// This function is "logically const" - it does not change state in
+	// a way visible outside the selection manager.
+	LLSelectMgr* self = const_cast<LLSelectMgr*>(this);
+	LLViewerObject* obj = self->mSelectedObjects->getFirstDeleteableObject();
 	// Note: Can only delete root objects (see getFirstDeleteableObject() for more info)
-	return const_cast<LLSelectMgr*>(this)->mSelectedObjects->getFirstDeleteableObject() != NULL; // HACK: casting away constness - MG
+	if (obj!= NULL)
+	{
+		// all the faces needs to be selected
+		if(self->mSelectedObjects->contains(obj,SELECT_ALL_TES ))
+		{
+			can_delete = true;
+		}
+	}
+	
+	return can_delete;
 }
 
 //-----------------------------------------------------------------------------
@@ -6189,8 +6204,14 @@ BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te)
 			LLSelectNode* nodep = *iter;
 			if (nodep->getObject() == object)
 			{
+				// Optimization
+				if (nodep->getTESelectMask() == TE_SELECT_MASK_ALL)
+				{
+					return TRUE;
+				}
+
 				BOOL all_selected = TRUE;
-				for (S32 i = 0; i < SELECT_MAX_TES; i++)
+				for (S32 i = 0; i < object->getNumTEs(); i++)
 				{
 					all_selected = all_selected && nodep->isTESelected(i);
 				}
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 449bdefb8f8b0d3f9ff2309e4be254ab96d12df0..25518d87d6e4f31ea0d073c28d1cbc8e9c4c165b 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -109,19 +109,30 @@ BOOL LLSidepanelItemInfo::postBuild()
 {
 	LLSidepanelInventorySubpanel::postBuild();
 
-	// build the UI
-	// item name & description
 	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
-	//getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
+	getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
 	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
-	//getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
-
+	getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
 	// Creator information
 	getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this));
-
 	// owner information
 	getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this));
-
+	// acquired date
+	// owner permissions
+	// Permissions debug text
+	// group permissions
+	getChild<LLUICtrl>("CheckShareWithGroup")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+	// everyone permissions
+	getChild<LLUICtrl>("CheckEveryoneCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+	// next owner permissions
+	getChild<LLUICtrl>("CheckNextOwnerModify")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+	getChild<LLUICtrl>("CheckNextOwnerCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+	getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));
+	// Mark for sale or not, and sale info
+	getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));
+	getChild<LLUICtrl>("RadioSaleType")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleType, this));
+	// "Price" label for edit
+	getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));
 	refresh();
 	return TRUE;
 }
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index f3d161ce1e58f64a05de079a95e3feccc8c21e02..93655eb1f1aeaa742d54ba2f5d2ad23832bb192e 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -369,8 +369,6 @@ bool idle_startup()
 	LLMemType mt1(LLMemType::MTYPE_STARTUP);
 	
 	const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");
-	const F32 TIMEOUT_SECONDS = 5.f;
-	const S32 MAX_TIMEOUT_COUNT = 3;
 	static LLTimer timeout;
 	static S32 timeout_count = 0;
 
@@ -1438,9 +1436,9 @@ bool idle_startup()
 		msg->addUUIDFast(_PREHASH_ID, gAgent.getID());
 		msg->sendReliable(
 			gFirstSim,
-			MAX_TIMEOUT_COUNT,
+			gSavedSettings.getS32("UseCircuitCodeMaxRetries"),
 			FALSE,
-			TIMEOUT_SECONDS,
+			gSavedSettings.getF32("UseCircuitCodeTimeout"),
 			use_circuit_callback,
 			NULL);
 
@@ -2697,12 +2695,15 @@ std::string LLStartUp::startupStateToString(EStartupState state)
 #define RTNENUM(E) case E: return #E
 	switch(state){
 		RTNENUM( STATE_FIRST );
+		RTNENUM( STATE_BROWSER_INIT );
 		RTNENUM( STATE_LOGIN_SHOW );
 		RTNENUM( STATE_LOGIN_WAIT );
 		RTNENUM( STATE_LOGIN_CLEANUP );
 		RTNENUM( STATE_LOGIN_AUTH_INIT );
 		RTNENUM( STATE_LOGIN_PROCESS_RESPONSE );
 		RTNENUM( STATE_WORLD_INIT );
+		RTNENUM( STATE_MULTIMEDIA_INIT );
+		RTNENUM( STATE_FONT_INIT );
 		RTNENUM( STATE_SEED_GRANTED_WAIT );
 		RTNENUM( STATE_SEED_CAP_GRANTED );
 		RTNENUM( STATE_WORLD_WAIT );
@@ -2741,6 +2742,9 @@ void LLStartUp::postStartupState()
 
 void reset_login()
 {
+	gAgent.cleanup();
+	LLWorld::getInstance()->destroyClass();
+
 	LLStartUp::setStartupState( STATE_LOGIN_SHOW );
 
 	if ( gViewerWindow )
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index bef7f5d6aa6f88790f2147cfa1813391f40a360a..1ebf624eeb563f71734aef45e764b723eafc52c2 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -34,10 +34,12 @@
 
 #include "llflatlistview.h"
 #include "llfloaterreg.h"
+#include "llnotifications.h"
 
 #include "llsyswellwindow.h"
 
 #include "llbottomtray.h"
+#include "llscriptfloater.h"
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
 
@@ -170,6 +172,7 @@ void LLSysWellWindow::setVisible(BOOL visible)
 	if(mChannel)
 	{
 		mChannel->updateShowToastsState();
+		mChannel->redrawToasts();
 	}
 }
 
@@ -188,6 +191,7 @@ void LLSysWellWindow::setDocked(bool docked, bool pop_on_undock)
 	if(mChannel)
 	{
 		mChannel->updateShowToastsState();
+		mChannel->redrawToasts();
 	}
 }
 
@@ -356,7 +360,148 @@ BOOL LLIMWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
 	return LLPanel::handleMouseDown(x, y, mask);
 }
 
+/************************************************************************/
+/*         ObjectRowPanel implementation                                */
+/************************************************************************/
+
+LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& object_id, bool new_message/* = false*/)
+ : LLPanel()
+ , mChiclet(NULL)
+{
+	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_active_object_row.xml", NULL);
+
+	initChiclet(object_id);
+
+	LLTextBox* obj_name = getChild<LLTextBox>("object_name");
+	obj_name->setValue(getObjectName(object_id));
+
+	mCloseBtn = getChild<LLButton>("hide_btn");
+	mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::ObjectRowPanel::onClosePanel, this));
+}
+
+//---------------------------------------------------------------------------------
+LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel()
+{
+}
+
+std::string LLIMWellWindow::ObjectRowPanel::getObjectName(const LLUUID& object_id)
+{
+	using namespace LLNotificationsUI;
+	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+	if(!notification)
+	{
+		llwarns << "Invalid notification" << llendl;
+		return LLStringUtil::null;
+	}
+
+	std::string text;
+
+	switch(getObjectType(notification))
+	{
+	case OBJ_SCRIPT:
+		text = notification->getSubstitutions()["TITLE"].asString();
+		break;
+	case OBJ_LOAD_URL:
+		text = notification->getSubstitutions()["OBJECTNAME"].asString();
+		break;
+	case OBJ_GIVE_INVENTORY:
+		text = notification->getSubstitutions()["NAME"].asString();
+		break;
+	default:
+		text = getString("unknown_obj");
+		break;
+	}
+
+	return text;
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::ObjectRowPanel::onClosePanel()
+{
+	LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(mChiclet->getSessionId());
+}
+
+//static
+LLIMWellWindow::ObjectRowPanel::object_type_map LLIMWellWindow::ObjectRowPanel::initObjectTypeMap()
+{
+	object_type_map type_map;
+	type_map["ScriptDialog"] = OBJ_SCRIPT;
+	type_map["LoadWebPage"] = OBJ_LOAD_URL;
+	type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY;
+	return type_map;
+}
+
+// static
+LLIMWellWindow::ObjectRowPanel::EObjectType LLIMWellWindow::ObjectRowPanel::getObjectType(const LLNotificationPtr& notification)
+{
+	if(!notification)
+	{
+		llwarns << "Invalid notification" << llendl;
+		return OBJ_UNKNOWN;
+	}
+
+	static object_type_map type_map = initObjectTypeMap();
+	std::string name = notification->getName();
+	object_type_map::const_iterator it = type_map.find(name);
+	if(it != type_map.end())
+	{
+		return it->second;
+	}
+
+	llwarns << "Unknown object type" << llendl;
+	return OBJ_UNKNOWN;
+}
+
+void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool new_message/* = false*/)
+{
+	using namespace LLNotificationsUI;
+	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+	if(!notification)
+	{
+		llwarns << "Invalid notification" << llendl;
+		return;
+	}
+
+	// Choose which of the pre-created chiclets to use.
+	switch(getObjectType(notification))
+	{
+	case OBJ_GIVE_INVENTORY:
+		mChiclet = getChild<LLInvOfferChiclet>("inv_offer_chiclet");
+		break;
+	default:
+		mChiclet = getChild<LLScriptChiclet>("object_chiclet");
+		break;
+	}
+
+	mChiclet->setVisible(true);
+	mChiclet->setSessionId(object_id);
+//	mChiclet->setShowNewMessagesIcon(new_message);
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::ObjectRowPanel::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+	setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemSelected"));
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::ObjectRowPanel::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+	setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemUnselected"));
+}
+
+//---------------------------------------------------------------------------------
+// virtual
+BOOL LLIMWellWindow::ObjectRowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+	// Pass the mouse down event to the chiclet (EXT-596).
+	if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown()
+		mChiclet->onMouseDown();
 
+	return LLPanel::handleMouseDown(x, y, mask);
+}
 
 /************************************************************************/
 /*         LLNotificationWellWindow implementation                      */
@@ -503,6 +648,7 @@ LLIMWellWindow::LLIMWellWindow(const LLSD& key)
 {
 	LLIMMgr::getInstance()->addSessionObserver(this);
 	LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findIMChiclet, this, _1));
+	LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findObjectChiclet, this, _1));
 }
 
 LLIMWellWindow::~LLIMWellWindow()
@@ -557,6 +703,18 @@ void LLIMWellWindow::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID
 	}
 }
 
+LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& object_id)
+{
+	LLChiclet* res = NULL;
+	ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(object_id);
+	if (panel != NULL)
+	{
+		res = panel->mChiclet;
+	}
+
+	return res;
+}
+
 //////////////////////////////////////////////////////////////////////////
 // PRIVATE METHODS
 LLChiclet* LLIMWellWindow::findIMChiclet(const LLUUID& sessionId)
@@ -615,4 +773,41 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
 	}
 }
 
+void LLIMWellWindow::addObjectRow(const LLUUID& object_id, bool new_message/* = false*/)
+{
+	if (mMessageList->getItemByValue(object_id) == NULL)
+	{
+		ObjectRowPanel* item = new ObjectRowPanel(object_id, new_message);
+		if (mMessageList->insertItemAfter(mSeparator, item, object_id))
+		{
+			handleItemAdded(IT_INSTANT_MESSAGE);
+		}
+		else
+		{
+			llwarns << "Unable to add Object Row into the list, objectID: " << object_id << llendl;
+			item->die();
+		}
+		reshapeWindow();
+	}
+}
+
+void LLIMWellWindow::removeObjectRow(const LLUUID& object_id)
+{
+	if (mMessageList->removeItemByValue(object_id))
+	{
+		handleItemRemoved(IT_INSTANT_MESSAGE);
+	}
+	else
+	{
+		llwarns << "Unable to remove Object Row from the list, objectID: " << object_id << llendl;
+	}
+
+	reshapeWindow();
+	// hide chiclet window if there are no items left
+	if(isWindowEmpty())
+	{
+		setVisible(FALSE);
+	}
+}
+
 // EOF
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index adbc83677da9563745f1872beef0467c0331184a..43b2723df02d9071481bd95ee31cb18dedd889ba 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -46,7 +46,7 @@
 class LLFlatListView;
 class LLChiclet;
 class LLIMChiclet;
-
+class LLScriptChiclet;
 
 
 class LLSysWellWindow : public LLDockableFloater
@@ -126,14 +126,12 @@ class LLSysWellWindow : public LLDockableFloater
  * 
  * It contains a list of notifications that have not been responded to.
  */
-class LLNotificationWellWindow : public LLSysWellWindow, public LLInitClass<LLNotificationWellWindow>
+class LLNotificationWellWindow : public LLSysWellWindow
 {
 public:
 	LLNotificationWellWindow(const LLSD& key);
 	static LLNotificationWellWindow* getInstance(const LLSD& key = LLSD());
 
-	static void initClass() { getInstance(); }
-
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void setVisible(BOOL visible);
 
@@ -181,11 +179,16 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<
 	/*virtual*/ void sessionRemoved(const LLUUID& session_id);
 	/*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
 
+	void addObjectRow(const LLUUID& object_id, bool new_message = false);
+	void removeObjectRow(const LLUUID& object_id);
+
 protected:
 	/*virtual*/ const std::string& getAnchorViewName() { return IM_WELL_ANCHOR_NAME; }
 
 private:
 	LLChiclet * findIMChiclet(const LLUUID& sessionId);
+	LLChiclet* findObjectChiclet(const LLUUID& object_id);
+
 	void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId);
 	void delIMRow(const LLUUID& sessionId);
 
@@ -210,6 +213,37 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<
 		LLButton*	mCloseBtn;
 		const LLSysWellWindow* mParent;
 	};
+
+	class ObjectRowPanel: public LLPanel
+	{
+		typedef enum e_object_type
+		{
+			OBJ_UNKNOWN,
+
+			OBJ_SCRIPT,
+			OBJ_GIVE_INVENTORY,
+			OBJ_LOAD_URL
+		}EObjectType;
+
+	public:
+		ObjectRowPanel(const LLUUID& object_id, bool new_message = false);
+		virtual ~ObjectRowPanel();
+		/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+		/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+		/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+	private:
+		void onClosePanel();
+		static EObjectType getObjectType(const LLNotificationPtr& notification);
+		void initChiclet(const LLUUID& object_id, bool new_message = false);
+		std::string getObjectName(const LLUUID& object_id);
+
+		typedef std::map<std::string, EObjectType> object_type_map;
+		static object_type_map initObjectTypeMap();
+	public:
+		LLIMChiclet* mChiclet;
+	private:
+		LLButton*	mCloseBtn;
+	};
 };
 
 #endif // LL_LLSYSWELLWINDOW_H
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index ef49d7f057e27a8e9d857b3f8db5bd559698b40f..67007629c06523c5f82fa71f272d73dd4e8572e7 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -1630,6 +1630,16 @@ S32 LLTextureFetch::update(U32 max_time_ms)
 	{
 		sendRequestListToSimulators();
 	}
+
+	if (!mThreaded)
+	{
+		// Update Curl on same thread as mCurlGetRequest was constructed
+		S32 processed = mCurlGetRequest->process();
+		if (processed > 0)
+		{
+			lldebugs << "processed: " << processed << " messages." << llendl;
+		}
+	}
 	
 	return res;
 }
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index fc7c029a1713eec38a130c93758ae9725a255538..4131e2755a8089ba08b0edfb43281d8edca6d054 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -67,7 +67,8 @@ LLToast::LLToast(const LLToast::Params& p)
 	mHideBtn(NULL),
 	mNotification(p.notification),
 	mIsHidden(false),
-	mHideBtnPressed(false)
+	mHideBtnPressed(false),
+	mIsTip(p.is_tip)
 {
 	LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
 
@@ -98,9 +99,29 @@ BOOL LLToast::postBuild()
 		mTimer.stop();
 	}
 
+	if (mIsTip)
+	{
+		mTextEditor = mPanel->getChild<LLTextEditor>("text_editor_box");
+
+		if (mTextEditor)
+		{
+			mTextEditor->setMouseUpCallback(boost::bind(&LLToast::hide,this));
+			mPanel->setMouseUpCallback(boost::bind(&LLToast::handleTipToastClick, this, _2, _3, _4));
+		}
+	}
+
 	return TRUE;
 }
 
+//--------------------------------------------------------------------------
+void LLToast::handleTipToastClick(S32 x, S32 y, MASK mask)
+{
+	if (!mTextEditor->getRect().pointInRect(x, y))
+	{
+		hide();
+	}
+}
+
 //--------------------------------------------------------------------------
 void LLToast::setHideButtonEnabled(bool enabled)
 {
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index d08e46e1604d98010c9251619735b9ece519e49d..0c3c59870435267b99c15ccd37c5a035ee65e36f 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -40,6 +40,7 @@
 #include "llnotificationptr.h"
 
 #include "llviewercontrol.h"
+#include "lltexteditor.h"
 
 #define MOUSE_LEAVE false
 #define MOUSE_ENTER true
@@ -155,6 +156,8 @@ class LLToast : public LLModalDialog
 
 private:
 
+	void handleTipToastClick(S32 x, S32 y, MASK mask);
+
 	// check timer
 	bool	lifetimeHasExpired();
 	// on timer finished function
@@ -169,8 +172,9 @@ class LLToast : public LLModalDialog
 	F32			mToastLifetime; // in seconds
 	F32			mToastFadingTime; // in seconds
 
-	LLPanel*	mPanel;
-	LLButton*	mHideBtn;
+	LLPanel*		mPanel;
+	LLButton*		mHideBtn;
+	LLTextEditor*	mTextEditor;
 
 	LLColor4	mBgColor;
 	bool		mCanFade;
@@ -178,6 +182,7 @@ class LLToast : public LLModalDialog
 	bool		mHideBtnEnabled;
 	bool		mHideBtnPressed;
 	bool		mIsHidden;  // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)
+	bool		mIsTip;
 };
 
 }
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 7beba59c83416fddaf019a89c6423e827710f99d..ed9e2e8818fd43fc38a0f06bb16a40975faa6075 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -85,7 +85,6 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif
 		sys_msg_icon->setVisible(FALSE);
 
 		mAvatar->setValue(p.avatar_id);
-		setMouseDownCallback(boost::bind(&LLToastIMPanel::onClickToastIM, this));
 	}
 
 	S32 maxLinesCount;
@@ -102,11 +101,13 @@ LLToastIMPanel::~LLToastIMPanel()
 {
 }
 
-//--------------------------------------------------------------------------
-void LLToastIMPanel::onClickToastIM()
+//virtual
+BOOL LLToastIMPanel::handleMouseDown(S32 x, S32 y, MASK mask)
 {
-	mNotification->respond(mNotification->getResponseTemplate());
-}
-
-//--------------------------------------------------------------------------
+	if (LLPanel::handleMouseDown(x,y,mask) == FALSE)
+	{
+		mNotification->respond(mNotification->getResponseTemplate());
+	}
 
+	return TRUE;
+}
diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h
index 23f08ef6103090ee6774c37207b1c3a527516c66..53661f2cf69a142f1317263b01943dc471081b37 100644
--- a/indra/newview/lltoastimpanel.h
+++ b/indra/newview/lltoastimpanel.h
@@ -57,12 +57,10 @@ class LLToastIMPanel: public LLToastPanel
 
 	LLToastIMPanel(LLToastIMPanel::Params &p);
 	virtual ~LLToastIMPanel();
-
+	/*virtual*/ BOOL 	handleMouseDown(S32 x, S32 y, MASK mask);
 private:
 	static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT;
 
-	void onClickToastIM();
-
 	LLNotificationPtr	mNotification;
 	LLUUID				mSessionID;
 	LLAvatarIconCtrl*	mAvatar;
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 2d0a14dc70a21dbad654b503d9c7138f12b2d97f..aa35f229309899c707f7e2d4604b92dbdf665b1a 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -772,6 +772,9 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
 		{
 			LLInventoryObject* cargo = locateInventory(item, cat);
 
+			// fix for EXT-3191
+			if (NULL == cargo) return;
+
 			EAcceptance item_acceptance = ACCEPT_NO;
 			handled = handled && root_view->handleDragAndDrop(x, y, mask, FALSE,
 												mCargoTypes[mCurItemIndex],
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index 46618d40268966533287006d1ca198c41af047ec..f8c82f8b22b64881feded6201ca025050166e8de 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -47,11 +47,14 @@
 #include "llurlsimstring.h"
 #include "llweb.h"
 #include "llworldmapmessage.h"
+#include "llurldispatcherlistener.h"
 
 // library includes
 #include "llnotificationsutil.h"
 #include "llsd.h"
 
+static LLURLDispatcherListener sURLDispatcherListener;
+
 class LLURLDispatcherImpl
 {
 public:
diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fea6a769c518a4600c3755de031e12b34e7899d8
--- /dev/null
+++ b/indra/newview/llurldispatcherlistener.cpp
@@ -0,0 +1,58 @@
+/**
+ * @file   llurldispatcherlistener.cpp
+ * @author Nat Goodspeed
+ * @date   2009-12-10
+ * @brief  Implementation for llurldispatcherlistener.
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llurldispatcherlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llurldispatcher.h"
+
+LLURLDispatcherListener::LLURLDispatcherListener(/* LLURLDispatcher* instance */):
+    LLEventAPI("LLURLDispatcher", "Internal URL handling") /* ,
+    mDispatcher(instance) */
+{
+    add("dispatch",
+        "At startup time or on clicks in internal web browsers,\n"
+        "teleport, open map, or run requested command.\n"
+        "[\"url\"] string url to dispatch\n"
+        "[\"trusted\"] boolean indicating trusted browser [default true]",
+        &LLURLDispatcherListener::dispatch);
+    add("dispatchRightClick", "Dispatch [\"url\"] as if from a right-click on a hot link.",
+        &LLURLDispatcherListener::dispatchRightClick);
+    add("dispatchFromTextEditor", "Dispatch [\"url\"] as if from an edit field.",
+        &LLURLDispatcherListener::dispatchFromTextEditor);
+}
+
+void LLURLDispatcherListener::dispatch(const LLSD& params) const
+{
+    // For most purposes, we expect callers to want to be trusted.
+    bool trusted_browser = true;
+    if (params.has("trusted"))
+    {
+        // But for testing, allow a caller to specify untrusted.
+        trusted_browser = params["trusted"].asBoolean();
+    }
+    LLURLDispatcher::dispatch(params["url"], NULL, trusted_browser);
+}
+
+void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const
+{
+    LLURLDispatcher::dispatchRightClick(params["url"]);
+}
+
+void LLURLDispatcherListener::dispatchFromTextEditor(const LLSD& params) const
+{
+    LLURLDispatcher::dispatchFromTextEditor(params["url"]);
+}
diff --git a/indra/newview/llurldispatcherlistener.h b/indra/newview/llurldispatcherlistener.h
new file mode 100644
index 0000000000000000000000000000000000000000..894afcbb5124a14b6606625423086ddc9b587d9d
--- /dev/null
+++ b/indra/newview/llurldispatcherlistener.h
@@ -0,0 +1,32 @@
+/**
+ * @file   llurldispatcherlistener.h
+ * @author Nat Goodspeed
+ * @date   2009-12-10
+ * @brief  LLEventAPI for LLURLDispatcher
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLURLDISPATCHERLISTENER_H)
+#define LL_LLURLDISPATCHERLISTENER_H
+
+#include "lleventapi.h"
+class LLURLDispatcher;
+class LLSD;
+
+class LLURLDispatcherListener: public LLEventAPI
+{
+public:
+    LLURLDispatcherListener(/* LLURLDispatcher* instance */); // all static members
+
+private:
+    void dispatch(const LLSD& params) const;
+    void dispatchRightClick(const LLSD& params) const;
+    void dispatchFromTextEditor(const LLSD& params) const;
+
+    //LLURLDispatcher* mDispatcher;
+};
+
+#endif /* ! defined(LL_LLURLDISPATCHERLISTENER_H) */
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index 297c0cc111ad97822dc7f72c3425babf8f99f753..b8f91697e5262a83b2d62774cf10f0f395c090ef 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -49,24 +49,38 @@
 
 void LLViewerHelp::showTopic(const std::string &topic)
 {
-	showHelp();
-	
 	// allow overriding the help server with a local help file
 	if( gSavedSettings.getBOOL("HelpUseLocal") )
 	{
+		showHelp();
 		LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
 		helpbrowser->navigateToLocalPage( "help-offline" , "index.html" );
 		return;
 	}
 
-	// use a special login topic before the user logs in
+	// if the help topic is empty, use the default topic
 	std::string help_topic = topic;
-	if (! LLLoginInstance::getInstance()->authSuccess())
+	if (help_topic.empty())
 	{
-		help_topic = preLoginTopic();
+		help_topic = defaultTopic();
+	}
+
+	// f1 help topic means: if user not logged in yet, show the
+	// pre-login topic, otherwise show help for the focused item
+	if (help_topic == f1HelpTopic())
+	{
+		if (! LLLoginInstance::getInstance()->authSuccess())
+		{
+			help_topic = preLoginTopic();
+		}
+		else
+		{
+			help_topic = getTopicFromFocus();
+		}
 	}
 
 	// work out the URL for this topic and display it 
+	showHelp();
 	const LLOSInfo& osinfo = LLAppViewer::instance()->getOSInfo();
 	std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic, gSavedSettings, osinfo );
 	setRawURL( helpURL );
@@ -84,6 +98,12 @@ std::string LLViewerHelp::preLoginTopic()
 	return "pre_login_help";
 }
 
+std::string LLViewerHelp::f1HelpTopic()
+{
+	// *hack: to be done properly
+	return "f1_help";
+}
+
 //////////////////////////////
 // our own interfaces
 
diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h
index dcb5ae32c98956b7349b37703e9adc723b2f9ffc..07971a593e919f645a72789358ebae576edef710 100644
--- a/indra/newview/llviewerhelp.h
+++ b/indra/newview/llviewerhelp.h
@@ -51,14 +51,17 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
 	/// display the specified help topic in the help viewer
 	/*virtual*/ void showTopic(const std::string &topic);
 
-	/// return default (fallback) topic name suitable for showTopic()
-	/*virtual*/ std::string defaultTopic();
-
 	// return topic derived from viewer UI focus, else default topic
 	std::string getTopicFromFocus();
 
+	/// return default (fallback) topic name suitable for showTopic()
+	/*virtual*/ std::string defaultTopic();
+
 	// return topic to use before the user logs in
-	std::string preLoginTopic();
+	/*virtual*/ std::string preLoginTopic();
+
+	// return topic to use for the top-level help, invoked by F1
+	/*virtual*/ std::string f1HelpTopic();
 
  private:
 	static void showHelp(); // make sure help UI is visible & raised
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 9856cb2b7fdd671d9746a00a1c19996d75b75203..78cee153845959b501e39fb590ce592b2b70e814 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1379,6 +1379,25 @@ LLViewerInventoryCategory *LLViewerInventoryItem::getLinkedCategory() const
 	return NULL;
 }
 
+bool LLViewerInventoryItem::checkPermissionsSet(PermissionMask mask) const
+{
+	const LLPermissions& perm = getPermissions();
+	PermissionMask curr_mask = PERM_NONE;
+	if(perm.getOwner() == gAgent.getID())
+	{
+		curr_mask = perm.getMaskBase();
+	}
+	else if(gAgent.isInGroup(perm.getGroup()))
+	{
+		curr_mask = perm.getMaskGroup();
+	}
+	else
+	{
+		curr_mask = perm.getMaskEveryone();
+	}
+	return ((curr_mask & mask) == mask);
+}
+
 //----------
 
 void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name)
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 0156e7dab16c00f1d21e0950462263c7c8f85b2e..412a2c66e65dcaf881353bb59a6ebe905c541338 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -158,6 +158,9 @@ class LLViewerInventoryItem : public LLInventoryItem, public boost::signals2::tr
 	bool getIsBrokenLink() const; // true if the baseitem this points to doesn't exist in memory.
 	LLViewerInventoryItem *getLinkedItem() const;
 	LLViewerInventoryCategory *getLinkedCategory() const;
+	
+	// Checks the items permissions (for owner, group, or everyone) and returns true if all mask bits are set.
+	bool checkPermissionsSet(PermissionMask mask) const;
 
 	// callback
 	void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 952de002720c509500fc818cdc6ba858402cdf51..ef8f63484ee73fc2b95647ef22b5213411efb5c4 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -988,11 +988,10 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
 	}
 	else
 	{
-		std::string plugins_path = gDirUtilp->getLLPluginDir();
-		plugins_path += gDirUtilp->getDirDelimiter();
-		
 		std::string launcher_name = gDirUtilp->getLLPluginLauncher();
 		std::string plugin_name = gDirUtilp->getLLPluginFilename(plugin_basename);
+		std::string user_data_path = gDirUtilp->getOSUserAppDir();
+		user_data_path += gDirUtilp->getDirDelimiter();
 
 		// See if the plugin executable exists
 		llstat s;
@@ -1008,7 +1007,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
 		{
 			LLPluginClassMedia* media_source = new LLPluginClassMedia(owner);
 			media_source->setSize(default_width, default_height);
-			if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins")))
+			if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"), user_data_path))
 			{
 				return media_source;
 			}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 431b4d3c0a85a46db6f7de51192eeaf3b0c62d67..36d9e7935ff0f650367ed7fa87af5affe3bb044c 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -59,6 +59,7 @@
 #include "llfloaterland.h"
 #include "llfloaterpay.h"
 #include "llfloaterreporter.h"
+#include "llfloatersearch.h"
 #include "llfloaterscriptdebug.h"
 #include "llfloatertools.h"
 #include "llfloaterworldmap.h"
@@ -2698,20 +2699,24 @@ BOOL enable_has_attachments(void*)
 bool enable_object_mute()
 {
 	LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
-	bool new_value = (object != NULL);
-	if (new_value)
+	if (!object) return false;
+
+	LLVOAvatar* avatar = find_avatar_from_object(object); 
+	if (avatar)
 	{
-		LLVOAvatar* avatar = find_avatar_from_object(object); 
-		if (avatar)
-		{
-			// It's an avatar
-			LLNameValue *lastname = avatar->getNVPair("LastName");
-			BOOL is_linden = lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden");
-			BOOL is_self = avatar->isSelf();
-			new_value = !is_linden && !is_self;
-		}
+		// It's an avatar
+		LLNameValue *lastname = avatar->getNVPair("LastName");
+		bool is_linden =
+			lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden");
+		bool is_self = avatar->isSelf();
+		return !is_linden && !is_self;
+	}
+	else
+	{
+		// Just a regular object
+		return LLSelectMgr::getInstance()->getSelection()->
+			contains( object, SELECT_ALL_TES );
 	}
-	return new_value;
 }
 
 class LLObjectMute : public view_listener_t
@@ -3404,6 +3409,13 @@ void set_god_level(U8 god_level)
 
 	// changing god-level can affect which menus we see
 	show_debug_menus();
+
+	// changing god-level can invalidate search results
+	LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search"));
+	if (search)
+	{
+		search->godLevelChanged(god_level);
+	}
 }
 
 #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
@@ -5563,17 +5575,8 @@ class LLShowHelp : public view_listener_t
 	bool handleEvent(const LLSD& userdata)
 	{
 		std::string help_topic = userdata.asString();
-
 		LLViewerHelp* vhelp = LLViewerHelp::getInstance();
-		if (help_topic.empty())
-		{
-			vhelp->showTopic(vhelp->getTopicFromFocus());
-		}
-		else
-		{
-			vhelp->showTopic(help_topic);
-		}
-
+		vhelp->showTopic(help_topic);
 		return true;
 	}
 };
@@ -7558,12 +7561,11 @@ void initialize_menus()
 	
 	LLUICtrl::EnableCallbackRegistry::Registrar& enable = LLUICtrl::EnableCallbackRegistry::currentRegistrar();
 	LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar();
-	LLUICtrl::VisibleCallbackRegistry::Registrar& visible = LLUICtrl::VisibleCallbackRegistry::currentRegistrar();
 	
 	// Generic enable and visible
 	// Don't prepend MenuName.Foo because these can be used in any menu.
 	enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service));
-	visible.add("IsGodCustomerService", boost::bind(&is_god_customer_service));
+	enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service));
 
 	// Agent
 	commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying));
@@ -7670,7 +7672,6 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLToolsEnableLink(), "Tools.EnableLink");
 	view_listener_t::addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink");
 	view_listener_t::addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake");
-	visible.add("Tools.VisibleTakeCopy", boost::bind(&enable_object_take_copy));
 	enable.add("Tools.EnableTakeCopy", boost::bind(&enable_object_take_copy));
 	view_listener_t::addMenu(new LLToolsEnableSaveToInventory(), "Tools.EnableSaveToInventory");
 	view_listener_t::addMenu(new LLToolsEnableSaveToObjectInventory(), "Tools.EnableSaveToObjectInventory");
@@ -7846,7 +7847,6 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp");
 	view_listener_t::addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments");
 
-	visible.add("Self.VisibleStandUp", boost::bind(&enable_standup_self));
 	enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self));
 	view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments");
 
@@ -7869,59 +7869,42 @@ void initialize_menus()
 	
 	view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend");
 	enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
-	visible.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
+	enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
 
 	// Object pie menu
 	view_listener_t::addMenu(new LLObjectBuild(), "Object.Build");
 	commit.add("Object.Touch", boost::bind(&handle_object_touch));
 	commit.add("Object.SitOrStand", boost::bind(&handle_object_sit_or_stand));
-	visible.add("Object.EnableSit", boost::bind(&enable_sit_object));
+	enable.add("Object.EnableSit", boost::bind(&enable_sit_object));
 	commit.add("Object.Delete", boost::bind(&handle_object_delete));
 	view_listener_t::addMenu(new LLObjectAttachToAvatar(), "Object.AttachToAvatar");
 	view_listener_t::addMenu(new LLObjectReturn(), "Object.Return");
 	view_listener_t::addMenu(new LLObjectReportAbuse(), "Object.ReportAbuse");
 	view_listener_t::addMenu(new LLObjectMute(), "Object.Mute");
 
-	visible.add("Object.VisibleTake", boost::bind(&visible_take_object));
-	visible.add("Object.VisibleBuy", boost::bind(&visible_buy_object));
+	enable.add("Object.VisibleTake", boost::bind(&visible_take_object));
+	enable.add("Object.VisibleBuy", boost::bind(&visible_buy_object));
 
 	commit.add("Object.Buy", boost::bind(&handle_buy));
 	commit.add("Object.Edit", boost::bind(&handle_object_edit));
 	commit.add("Object.Inspect", boost::bind(&handle_object_inspect));
 	commit.add("Object.Open", boost::bind(&handle_object_open));
-	
 	commit.add("Object.Take", boost::bind(&handle_take));
-
 	enable.add("Object.EnableOpen", boost::bind(&enable_object_open));
-	visible.add("Object.VisibleOpen", boost::bind(&enable_object_open));
-
 	enable.add("Object.EnableTouch", boost::bind(&enable_object_touch));
-	visible.add("Object.VisibleTouch", boost::bind(&enable_object_touch));
-
 	view_listener_t::addMenu(new LLObjectEnableTouch(), "Object.EnableTouch");
 	view_listener_t::addMenu(new LLObjectEnableSitOrStand(), "Object.EnableSitOrStand");
-	
 	enable.add("Object.EnableDelete", boost::bind(&enable_object_delete));
-	visible.add("Object.VisibleDelete", boost::bind(&enable_object_delete));
-
 	enable.add("Object.EnableWear", boost::bind(&object_selected_and_point_valid));
-	visible.add("Object.VisibleWear", boost::bind(&object_selected_and_point_valid));
 
 	view_listener_t::addMenu(new LLObjectEnableReturn(), "Object.EnableReturn");
 	view_listener_t::addMenu(new LLObjectEnableReportAbuse(), "Object.EnableReportAbuse");
 
 	enable.add("Avatar.EnableMute", boost::bind(&enable_object_mute));
 	enable.add("Object.EnableMute", boost::bind(&enable_object_mute));
-	visible.add("Object.VisibleMute", boost::bind(&enable_object_mute));
 
 	enable.add("Object.EnableBuy", boost::bind(&enable_buy_object));
 
-	/*view_listener_t::addMenu(new LLObjectVisibleTouch(), "Object.VisibleTouch");
-	view_listener_t::addMenu(new LLObjectVisibleCustomTouch(), "Object.VisibleCustomTouch");
-	view_listener_t::addMenu(new LLObjectVisibleStandUp(), "Object.VisibleStandUp");
-	view_listener_t::addMenu(new LLObjectVisibleSitHere(), "Object.VisibleSitHere");
-	view_listener_t::addMenu(new LLObjectVisibleCustomSit(), "Object.VisibleCustomSit");*/
-
 	// Attachment pie menu
 	enable.add("Attachment.Label", boost::bind(&onEnableAttachmentLabel, _1, _2));
 	view_listener_t::addMenu(new LLAttachmentDrop(), "Attachment.Drop");
@@ -7950,12 +7933,9 @@ void initialize_menus()
 	commit.add("PayObject", boost::bind(&handle_give_money_dialog));
 
 	enable.add("EnablePayObject", boost::bind(&enable_pay_object));
-	visible.add("VisiblePayObject", boost::bind(&enable_pay_object));
 	enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
 	enable.add("EnableEdit", boost::bind(&enable_object_edit));
-	visible.add("VisibleBuild", boost::bind(&enable_object_build));
-	visible.add("VisibleEdit", boost::bind(&enable_object_edit));
-	visible.add("Object.VisibleEdit", boost::bind(&enable_object_edit));
+	enable.add("VisibleBuild", boost::bind(&enable_object_build));
 
 	view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
 	view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 4b0dc8f668b4cbeeba39c186b10d444d562f11b7..a1c3806b27abcf533e7b2ee436d3efb3b9d3186c 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -71,15 +71,6 @@
 // system libraries
 #include <boost/tokenizer.hpp>
 
-class LLFileEnableSaveAs : public view_listener_t
-{
-	bool handleEvent(const LLSD& userdata)
-	{
-		bool new_value = gFloaterView->getFrontmost() && gFloaterView->getFrontmost()->canSaveAs();
-		return new_value;
-	}
-};
-
 class LLFileEnableUpload : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -386,19 +377,6 @@ class LLFileCloseAllWindows : public view_listener_t
 	}
 };
 
-class LLFileSaveTexture : public view_listener_t
-{
-	bool handleEvent(const LLSD& userdata)
-	{
-		LLFloater* top = gFloaterView->getFrontmost();
-		if (top)
-		{
-			top->saveAs();
-		}
-		return true;
-	}
-};
-
 class LLFileTakeSnapshotToDisk : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -1050,10 +1028,10 @@ void init_menu_file()
 	view_listener_t::addCommit(new LLFileCloseAllWindows(), "File.CloseAllWindows");
 	view_listener_t::addEnable(new LLFileEnableCloseWindow(), "File.EnableCloseWindow");
 	view_listener_t::addEnable(new LLFileEnableCloseAllWindows(), "File.EnableCloseAllWindows");
-	view_listener_t::addCommit(new LLFileSaveTexture(), "File.SaveTexture");
 	view_listener_t::addCommit(new LLFileTakeSnapshotToDisk(), "File.TakeSnapshotToDisk");
 	view_listener_t::addCommit(new LLFileQuit(), "File.Quit");
 
 	view_listener_t::addEnable(new LLFileEnableUpload(), "File.EnableUpload");
-	view_listener_t::addEnable(new LLFileEnableSaveAs(), "File.EnableSaveAs");
+	
+	// "File.SaveTexture" moved to llpanelmaininventory so that it can be properly handled.
 }
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 8c0529e34408106e59dea1d1efb676b92ecdfff2..31bd264e3a94356e8dcf734800da0796c07ac490 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2096,8 +2096,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			LLSD payload;
 			payload["object_id"] = session_id;
 			payload["owner_id"] = from_id;
+			payload["from_id"] = from_id;
 			payload["slurl"] = location;
 			payload["name"] = name;
+			std::string session_name;
+			gCacheName->getFullName(from_id, session_name);
+			payload["SESSION_NAME"] = session_name;
 			if (from_group)
 			{
 				payload["groupowned"] = "true";
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 2fae78cdfb6aa2ad82a056eb378b716877cf5c94..7a1abfd4e84597eaa6e5d65e8656d80b5f588c34 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -2525,7 +2525,8 @@ boost::signals2::connection LLViewerParcelMgr::setTeleportFailedCallback(parcel_
  */
 void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos)
 {
-	if (local)
+	// Treat only teleports within the same parcel as local (EXT-3139).
+	if (local && LLViewerParcelMgr::getInstance()->inAgentParcel(new_pos))
 	{
 		// Local teleport. We already have the agent parcel data.
 		// Emit the signal immediately.
@@ -2533,7 +2534,7 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos
 	}
 	else
 	{
-		// Non-local teleport.
+		// Non-local teleport (inter-region or between different parcels of the same region).
 		// The agent parcel data has not been updated yet.
 		// Let's wait for the update and then emit the signal.
 		mTeleportInProgress = TRUE;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 0d29efaedf5acd27bacb941c43b26723380f3d43..a5a40e9c2cdba6709b20f718749b86deebea6e0e 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -2879,7 +2879,8 @@ BOOL LLViewerMediaTexture::findFaces()
 		}
 
 		S32 face_id = -1 ;
-		while((face_id = obj->getFaceIndexWithMediaImpl(mMediaImplp, face_id)) > -1)
+		S32 num_faces = obj->mDrawable->getNumFaces() ;
+		while((face_id = obj->getFaceIndexWithMediaImpl(mMediaImplp, face_id)) > -1 && face_id < num_faces)
 		{
 			LLFace* facep = obj->mDrawable->getFace(face_id) ;
 			if(facep)
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 03910b0534371e929b86dc3b8ea4880b923b4316..226d85ec9904526a7cc95ddab77da0ba3038ffc9 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -7651,6 +7651,9 @@ void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& di
 
 void LLVOAvatar::idleUpdateRenderCost()
 {
+	static const U32 ARC_BODY_PART_COST = 20;
+	static const U32 ARC_LIMIT = 2048;
+
 	if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
 	{
 		return;
@@ -7667,7 +7670,7 @@ void LLVOAvatar::idleUpdateRenderCost()
 		{
 			if (isTextureVisible(tex_index))
 			{
-				cost +=20;
+				cost +=ARC_BODY_PART_COST;
 			}
 		}
 	}
@@ -7687,7 +7690,6 @@ void LLVOAvatar::idleUpdateRenderCost()
 				const LLDrawable* drawable = attached_object->mDrawable;
 				if (drawable)
 				{
-					cost += 10;
 					const LLVOVolume* volume = drawable->getVOVolume();
 					if (volume)
 					{
@@ -7698,11 +7700,11 @@ void LLVOAvatar::idleUpdateRenderCost()
 		}
 	}
 
-	cost += textures.size() * 5;
+	cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
 
 	setDebugText(llformat("%d", cost));
-	F32 green = 1.f-llclamp(((F32) cost-1024.f)/1024.f, 0.f, 1.f);
-	F32 red = llmin((F32) cost/1024.f, 1.f);
+	F32 green = 1.f-llclamp(((F32) cost-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);
+	F32 red = llmin((F32) cost/(F32)ARC_LIMIT, 1.f);
 	mText->setColor(LLColor4(red,green,0,1));
 }
 
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 7e1e7c940fdd333e6fd9dd9d17bf0b7a22253cb3..aa69b46857988168d9ef20ddfe53d247d2508e81 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -128,16 +128,8 @@ static int scale_mic_volume(float volume)
 static int scale_speaker_volume(float volume)
 {
 	// incoming volume has the range [0.0 ... 1.0], with 0.5 as the default.
-	// Map it as follows: 0.0 -> 0, 0.5 -> 62, 1.0 -> 75
-	
-	volume -= 0.5f;		// offset volume to the range [-0.5 ... 0.5], with 0 at the default.
-	int scaled_volume = 62;	// offset scaled_volume by its default level
-	if(volume < 0.0f)
-		scaled_volume += ((int)(volume * 124.0f));	// (62 - 0) * 2
-	else
-		scaled_volume += ((int)(volume * 26.0f));	// (75 - 62) * 2
-	
-	return scaled_volume;
+	// Map it as follows: 0.0 -> 0, 0.5 -> 50, 1.0 -> 100
+	return (int)(volume * 100.0f);
 }
 
 class LLViewerVoiceAccountProvisionResponder :
@@ -4279,6 +4271,7 @@ void LLVoiceClient::mediaStreamUpdatedEvent(
 				{
 					// Send the voice chat invite to the GUI layer
 					// *TODO: Question: Should we correlate with the mute list here?
+					session->mIncoming = true;
 					session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID);
 					session->mVoiceInvitePending = true;
 					if(session->mName.empty())
@@ -6353,6 +6346,20 @@ LLVoiceClient::sessionState *LLVoiceClient::findSession(const LLUUID &participan
 	return result;
 }
 
+bool LLVoiceClient::isSessionIncoming(const LLUUID &session_id)
+{
+	for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
+	{
+		sessionState *session = *iter;
+		if(session->mIMSessionID == session_id)
+		{
+			return session->mIncoming;
+			break;
+		}
+	}
+	return false;
+}
+
 LLVoiceClient::sessionState *LLVoiceClient::addSession(const std::string &uri, const std::string &handle)
 {
 	sessionState *result = NULL;
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index 347fae6156b9d45e571d0e49c8757c15d2b1d4ad..92e79a004d8973d69455fa557b0239ed27a142d9 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -125,7 +125,7 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient>
 		void tuningCaptureStartSendMessage(int duration);
 		void tuningCaptureStopSendMessage();
 		
-		void tuningSetMicVolume(float volume);
+		void tuningSetMicVolume(float volume=0.5f);
 		void tuningSetSpeakerVolume(float volume);
 		float tuningGetEnergy(void);
 				
@@ -527,6 +527,8 @@ static	void updatePosition(void);
 		// Currently this will be false only for PSTN P2P calls.
 		// NOTE: this will return true if the session can't be found. 
 		bool isSessionTextIMPossible(const LLUUID &session_id);
+
+		bool isSessionIncoming(const LLUUID &session_id);
 		
 	private:
 
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index cf61994feac796b39e308ceaf55cf734368cb7e9..36d6d2c04bf58f3a81d2c52359dec2f78e63f601 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -2587,7 +2587,22 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const
 // children, and cost should only be increased for unique textures  -Nyx
 U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const
 {
-	U32 shame = 0;
+	// base cost of each prim should be 10 points
+	static const U32 ARC_PRIM_COST = 10;
+	// per-prim costs
+	static const U32 ARC_INVISI_COST = 1;
+	static const U32 ARC_SHINY_COST = 1;
+	static const U32 ARC_GLOW_COST = 1;
+	static const U32 ARC_FLEXI_COST = 8;
+	static const U32 ARC_PARTICLE_COST = 16;
+	static const U32 ARC_BUMP_COST = 4;
+
+	// per-face costs
+	static const U32 ARC_PLANAR_COST = 1;
+	static const U32 ARC_ANIM_TEX_COST = 4;
+	static const U32 ARC_ALPHA_COST = 4;
+
+	U32 shame = ARC_PRIM_COST;
 
 	U32 invisi = 0;
 	U32 shiny = 0;
@@ -2663,7 +2678,17 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const
 		}
 	}
 
-	shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar;
+
+	shame += invisi * ARC_INVISI_COST;
+	shame += shiny * ARC_SHINY_COST;
+	shame += glow * ARC_GLOW_COST;
+	shame += alpha * ARC_ALPHA_COST;
+	shame += flexi * ARC_FLEXI_COST;
+	shame += animtex * ARC_ANIM_TEX_COST;
+	shame += particles * ARC_PARTICLE_COST;
+	shame += bump * ARC_BUMP_COST;
+	shame += planar * ARC_PLANAR_COST;
+	shame += scale;
 
 	LLViewerObject::const_child_list_t& child_list = getChildren();
 	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 06e214b41e307cb9747bfaa55c0603b77cbdd6a5..fe4b5488fa216740ee8ce1da71ff8202cda32842 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -310,6 +310,8 @@ class LLVOVolume : public LLViewerObject
 	static LLPointer<LLObjectMediaDataClient> sObjectMediaClient;
 	static LLPointer<LLObjectMediaNavigateClient> sObjectMediaNavigateClient;
 
+	static const U32 ARC_TEXTURE_COST = 5;
+
 protected:
 	static S32 sNumLODChanges;
 	
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index c8cc6a3d8ebe69540af02bf3bdcc929b7e614dad..697fefee3a5176a5a8686efe30d7a3b49d5873ed 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -91,7 +91,7 @@ LLWaterParamManager::~LLWaterParamManager()
 void LLWaterParamManager::loadAllPresets(const std::string& file_name)
 {
 	std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));
-	LL_INFOS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
+	LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
 			
 	bool found = true;			
 	while(found) 
@@ -117,7 +117,7 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
 	// And repeat for user presets, note the user presets will modify any system presets already loaded
 
 	std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
-	LL_INFOS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
+	LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
 			
 	found = true;			
 	while(found) 
@@ -152,7 +152,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
 	escaped_filename += ".xml";
 
 	std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename));
-	llinfos << "Loading water settings from " << pathName << llendl;
+	LL_DEBUGS2("AppInit", "Shaders") << "Loading water settings from " << pathName << LL_ENDL;
 	
 	llifstream presetsXML;
 	presetsXML.open(pathName.c_str());
@@ -161,7 +161,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
 	if(!presetsXML)
 	{
 		pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename);
-		llinfos << "Loading User water setting from " << pathName << llendl;
+		LL_DEBUGS2("AppInit", "Shaders") << "Loading User water setting from " << pathName << LL_ENDL;
 		presetsXML.clear();
         presetsXML.open(pathName.c_str());
 	}
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index c6fd35c1422522bec6160efcd86c63fbea01b1c3..c3a70705cfcb2ec6e2db8e7b44114e8513a8ea3d 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -109,7 +109,7 @@ LLWLParamManager::~LLWLParamManager()
 void LLWLParamManager::loadPresets(const std::string& file_name)
 {
 	std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
-	LL_INFOS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
+	LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
 			
 	bool found = true;			
 	while(found) 
@@ -135,7 +135,7 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
 	// And repeat for user presets, note the user presets will modify any system presets already loaded
 
 	std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
-	LL_INFOS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
+	LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
 			
 	found = true;			
 	while(found) 
@@ -196,7 +196,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
 	escaped_filename += ".xml";
 
 	std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename));
-	//llinfos << "Loading WindLight sky setting from " << pathName << llendl;
+	LL_DEBUGS2("AppInit", "Shaders") << "Loading WindLight sky setting from " << pathName << LL_ENDL;
 
 	llifstream presetsXML;
 	presetsXML.open(pathName.c_str());
@@ -205,7 +205,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
 	if(!presetsXML)
 	{
 		pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename);
-		llinfos << "Loading User WindLight sky setting from " << pathName << llendl;
+		LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight sky setting from " << pathName << LL_ENDL;
 		presetsXML.clear();
         presetsXML.open(pathName.c_str());
 	}
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 5c6fc2cf219aad2be75eb36b64cd8d9e3691693e..118d7f8d08d603809a4bee3a4844f07735f49f1e 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -118,6 +118,7 @@ LLWorld::LLWorld() :
 
 void LLWorld::destroyClass()
 {
+	mHoleWaterObjects.clear();
 	gObjectList.destroy();
 	for(region_list_t::iterator region_it = mRegionList.begin(); region_it != mRegionList.end(); )
 	{
diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png
new file mode 100644
index 0000000000000000000000000000000000000000..60676b43fd96e34c728bf71ab5fcfc0a442cb491
Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png differ
diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..98cde96aff13e42fc24f71d793613b32737e7b34
Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 607df10048248a2285749329c09ef043bb28fed2..24d3512bcb74ff81418854b7a5ba0f81531720dd 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -375,7 +375,7 @@ with the same filename but different name
  <texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" />
  <texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" />
  <texture name="Parcel_Scripts_Light" file_name="icons/Parcel_Scripts_Light.png" preload="false" />
- <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Light.png" preload="false" />
+ <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
  <texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" />
  <texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" />
 
@@ -592,6 +592,9 @@ with the same filename but different name
 
   <texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" />
   <texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" />
+  
+  <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" />
+  <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" />
 
   <texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
   <texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index d1fd42bdd9077489cc3c44e4db68a47aa4217175..52fda978607db40aa137bad59293aa971bc2c3c4 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1857,6 +1857,10 @@ Select the thumbnail to choose a different texture.
          top="0"
          help_topic="land_access_tab"
          name="land_access_panel">
+			<panel.string
+			 name="access_estate_defined">
+				(Defined by the Estate)
+			</panel.string>
             <panel.string
              name="estate_override">
                 One or more of these options is set at the estate level
@@ -1877,7 +1881,7 @@ Select the thumbnail to choose a different texture.
             <check_box
              follows="top|left"
              height="16"
-             label="Allow Public Access"
+             label="Allow Public Access [MATURITY]"
              layout="topleft"
              left_delta="0"
              name="public_access"
@@ -1893,12 +1897,12 @@ Select the thumbnail to choose a different texture.
              name="Only Allow"
              top="49"
              width="278">
-                Block Access By:
+                Restrict Access to Residents verified by:
             </text>
             <check_box
              follows="top|left"
              height="16"
-             label="Residents who have not given payment info to Linden Lab"
+             label="Payment Information on File [ESTATE_PAYMENT_LIMIT]"
              layout="topleft"
              left_delta="0"
              name="limit_payment"
@@ -1908,7 +1912,7 @@ Select the thumbnail to choose a different texture.
             <check_box
              follows="top|left"
              height="16"
-             label="Residents who are not age verified adults"
+             label="Age Verification [ESTATE_AGE_LIMIT]"
              layout="topleft"
              left_delta="0"
              name="limit_age_verified"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index 75711cdf89e88eb9bfe0de60b5f8fb4cf4ddc0af..26b003cafe5d28faaba604d847c7696653e95c8f 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -222,7 +222,7 @@
      width="300"
      height="30"
      name="currency_links">
-      [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com exchange rate]
+      [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
     </text>
     <text
      type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
index 526fda90d1d2333945bd82640ff0488ccbc57411..acd59b6f090ef343063ffc018a1710ff175646e3 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -36,21 +36,25 @@
      top="35"
      width="36" />
     <text
+     clip_partial="true"
      font="SansSerifLarge"
-     height="20"
+     height="37"
      layout="topleft"
      left="77"
      name="caller name"
-     top="27"
+     top="20"
+     use_ellipses="true"
      width="315"
      word_wrap="true" />
     <text
+     clip_partial="true"
      font="SansSerif"
-     height="50"
+     height="30"
      layout="topleft"
      left="77"
      name="question"
-     top="52"
+     top_pad="5"
+     use_ellipses="true"
      width="315"
      word_wrap="true">
      Do you want to leave [CURRENT_CHAT] and join this voice chat?
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index d182cdc6bbd1a1e0ea7ce097fa26db3aa24be3e3..15655a920e3c3b77a5c3e6e0637cb74690711dce 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -86,7 +86,7 @@
         <panel
 		 class="panel_preference"
          filename="panel_preferences_alerts.xml"
-         label="Alerts"
+         label="Notifications"
          layout="topleft"
          help_topic="preferences_msgs_tab"
          name="msgs" />
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index 52a19ac6b3ddb90ccd9df81ba24fa6441c8d8f6d..602a18ea56c421f9755b1e3b4ee972dba2e152df 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -61,7 +61,16 @@
      name="Discard"
      top_delta="0"
      width="100" />
-     <text
+    <button
+     follows="left|bottom"
+     height="22"
+     label="Save As"
+     layout="topleft"
+     left_pad="5"
+     name="save_tex_btn"
+     top_delta="0"
+     width="100" />
+    <text
      type="string"
      length="1"
      follows="left|bottom"
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index 82e4d87b287dc625de059c804ea989e5abb170fd..e6bdcdf78e6be45ece7573885d95934cf0693a60 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -55,8 +55,20 @@
              layout="topleft"
              left_delta="0"
              name="status_text"
-             top_pad="5"
+             top_pad="7"
              width="150" />
+            <text
+             visible="false"
+             follows="bottom|right"
+             height="16"
+             left_delta="0"
+             name="refresh_search"
+             left_pad="0"
+             right="-10"
+             halign="right"
+             width="450">
+               Redo search to reflect current God level
+            </text>
         </layout_panel>
     </layout_stack>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index 1ebc51f504ef494146e55cd33d88c75d03ce513f..c1a211967c18054804f1257e33cf150a7050031b 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -105,26 +105,6 @@
                  top="0"
                  width="24" />
             </layout_panel>
-            <layout_panel
-             layout="topleft"
-             name="volume_slider_panel"
-             top="0"
-             user_resize="false"
-             width="138">
-                <slider_bar
-                 control_name="AudioLevelMic"
-                 follows="left|right|top"
-                 height="24"
-                 increment="0.05"
-                 layout="topleft"
-                 left="0"
-                 max_val="2"
-                 name="volume_slider_bar"
-                 tool_tip="Master Volume"
-                 top="0"
-                 value="0.75"
-                 width="138" />
-            </layout_panel>
             <layout_panel
              auto_resize="false"
              layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index 8349f594d9354adad340614f90291b2429cce74c..996d0f1b723eb04bed81a3b7577a8f5efe452c9e 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -33,7 +33,7 @@
 [SL_PROFILE]
     </string>
   <text
-     follows="all"
+     follows="top|left"
      font="SansSerifLarge"
      height="16"
      left="8"
@@ -44,7 +44,7 @@
      value="Grumpity ProductEngine"
      width="175" />
     <text
-     follows="all"
+     follows="top|left"
      height="16"
      left="8"
      name="user_subtitle"
@@ -76,7 +76,7 @@
      value="0.5"
      width="195" />
     <button
-     follows="all"
+     follows="top|left"
      height="16"
      image_disabled="Audio_Off"
      image_disabled_selected="AudioMute_Off"
@@ -89,7 +89,7 @@
      name="mute_btn"
      width="16" />
     <avatar_icon
-     follows="all"
+     follows="top|left"
      height="38"
      right="-10"
      bevel_style="in"
@@ -102,7 +102,7 @@
     llinspectavatar.cpp makes visible the most likely default action 
 -->
     <button
-     follows="bottom|left"
+     follows="top|left"
      height="20"
      label="Add Friend"
      left="8"
@@ -110,7 +110,7 @@
      name="add_friend_btn"
      width="90" />
     <button
-     follows="bottom|left"
+     follows="top|left"
      height="20"
      label="IM"
      left_delta="0"
@@ -129,7 +129,8 @@
      tab_stop="false"
      width="80" />
       <!--  gear buttons here -->
-     <menu_button
+  <menu_button
+     follows="top|left"
      height="20"
      layout="topleft"
      image_overlay="OptionsMenu_Off"
@@ -147,4 +148,33 @@
      right="-5"
      top_delta="0"
      width="35" />
+  <panel 
+    follows="top|left" 
+    top="148" 
+    left="0" 
+    height="60" 
+    width="228" 
+    visible="false"
+    background_visible="true"
+    name="moderator_panel"
+    background_opaque="true" 
+    bg_opaque_color="MouseGray">
+    <button
+      name="disable_voice"
+      label="Disable Voice"
+      top="20"
+      width="95"
+      height="20"
+      left="10"
+      commit_callback.function="InspectAvatar.DisableVoice"/>
+    <button
+      name="enable_voice"
+      label="Enable Voice"
+      top="20"
+      width="95"
+      height="20"
+      left="10"
+      visible="false" 
+      commit_callback.function="InspectAvatar.EnableVoice"/>
+  </panel>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
index 04a247fd548cdf715d9318dc3079dc3e3ab87df6..22df02cd7e887b343dccbeb783a8c83b9c18156e 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
@@ -13,7 +13,7 @@
     <menu_item_call.on_click
      function="InspectObject.Touch"/>
     <menu_item_call.on_visible
-     function="Object.VisibleTouch" />
+     function="Object.EnableTouch" />
   </menu_item_call>
   <menu_item_call
   label="Sit"
@@ -31,7 +31,7 @@
     <menu_item_call.on_click
      function="InspectObject.Pay"/>
     <menu_item_call.on_visible
-     function="VisiblePayObject" />
+     function="EnablePayObject" />
   </menu_item_call>
   <menu_item_call
    label="Buy"
@@ -59,7 +59,7 @@
     <menu_item_call.on_click
      function="InspectObject.TakeFreeCopy"/>
     <menu_item_call.on_visible
-      function="Tools.VisibleTakeCopy"/>
+      function="Tools.EnableTakeCopy"/>
   </menu_item_call>
   <menu_item_call
    label="Open"
@@ -68,7 +68,7 @@
     <menu_item_call.on_click
      function="InspectObject.Open"/>
     <menu_item_call.on_visible
-     function="Object.VisibleOpen" />
+     function="Object.EnableOpen" />
   </menu_item_call>
   <menu_item_call
    label="Edit"
@@ -77,7 +77,7 @@
         <menu_item_call.on_click
          function="Object.Edit" />
         <menu_item_call.on_enable
-         function="Object.VisibleEdit"/>
+         function="EnableEdit"/>
   </menu_item_call>  
   <menu_item_call
    label="Wear"
@@ -86,7 +86,7 @@
     <menu_item_call.on_click
      function="Object.AttachToAvatar" />
     <menu_item_call.on_visible
-     function="Object.VisibleWear" />
+     function="Object.EnableWear" />
   </menu_item_call>  
   <menu_item_call
    label="Report"
@@ -102,7 +102,7 @@
     <menu_item_call.on_click
      function="Object.Mute" />
     <menu_item_call.on_visible
-     function="Object.VisibleMute" />
+     function="Object.EnableMute" />
   </menu_item_call>
   <menu_item_call
     label="Zoom In"
@@ -118,7 +118,7 @@
       <menu_item_call.on_click
        function="Object.Delete" />
       <menu_item_call.on_visible
-       function="Object.VisibleDelete" />
+       function="Object.EnableDelete" />
   </menu_item_call>
   <menu_item_call
    label="More Info"
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
index 3d65878cf8602f8ad6b8dc9c43ab3baf04bc1a14..9894a01701925a57d685ab220ea7a7d5db7c4043 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
@@ -13,7 +13,7 @@
      function="Self.StandUp"
      parameter="" />
     <menu_item_call.on_visible
-     function="Self.VisibleStandUp" />
+     function="Self.EnableStandUp" />
   </menu_item_call>
   <menu_item_call
    label="My Appearance"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 9b439c16e09b35c498310d2d80472ecfbef5e18c..53be40d7fd8604a3d918d0e6240e3c92168c9e10 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -45,7 +45,8 @@
          name="Second Life Help"
          shortcut="F1">
             <menu_item_call.on_click
-             function="ShowHelp" />
+             function="ShowHelp"
+             parameter="f1_help" />
         </menu_item_call>
         <menu_item_separator />
         <menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml
index 5ab327a182084d4636081efbe0f69c4151a2926a..0422972cd423624ddf1c2c778137e6cc4be773ad 100644
--- a/indra/newview/skins/default/xui/en/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml
@@ -89,4 +89,51 @@
          function="ParticipantList.EnableItem"
          parameter="can_allow_text_chat" />
     </menu_item_check>
+    <menu_item_separator
+     layout="topleft"
+     name="moderate_voice_separator" />
+    <menu_item_call
+     label="Mute this participant"
+     layout="topleft"
+     name="ModerateVoiceMuteSelected">
+        <on_click
+         function="ParticipantList.ModerateVoice"
+         parameter="selected" />
+        <on_enable
+         function="ParticipantList.EnableItem"
+         parameter="can_moderate_voice" />
+    </menu_item_call>
+    <menu_item_call
+     label="Mute everyone else"
+     layout="topleft"
+     name="ModerateVoiceMuteOthers">
+        <on_click
+         function="ParticipantList.ModerateVoice"
+         parameter="others" />
+        <on_enable
+         function="ParticipantList.EnableItem"
+         parameter="can_moderate_voice" />
+    </menu_item_call>
+    <menu_item_call
+     label="Unmute this participant"
+     layout="topleft"
+     name="ModerateVoiceUnMuteSelected">
+        <on_click
+         function="ParticipantList.ModerateVoice"
+         parameter="selected" />
+        <on_enable
+         function="ParticipantList.EnableItem"
+         parameter="can_moderate_voice" />
+    </menu_item_call>
+    <menu_item_call
+     label="Unmute everyone else"
+     layout="topleft"
+     name="ModerateVoiceUnMuteOthers">
+        <on_click
+         function="ParticipantList.ModerateVoice"
+         parameter="others" />
+        <on_enable
+         function="ParticipantList.EnableItem"
+         parameter="can_moderate_voice" />
+    </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index c3a2540b2e9597581330d9ebcc27c0a8d1ac1845..39469f7101c061d6abf29c5039b41f8d7f1fe9e5 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -34,7 +34,6 @@
          function="Avatar.Call" />
     </menu_item_call>
     <menu_item_call
-     enabled="false"
      label="Share"
      layout="topleft"
      name="Share">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 861b0de2cfaa107c405e75cda141887a3e2682b0..0891afaf76343528c3a9e94444b3e2a8ef5b284c 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1064,7 +1064,8 @@
          name="Second Life Help"
          shortcut="F1">
             <menu_item_call.on_click
-             function="ShowHelp" />
+             function="ShowHelp"
+             parameter="f1_help" />
         </menu_item_call>
         <menu_item_call
          label="Tutorial"
@@ -1200,15 +1201,6 @@
              function="ToggleControl"
              parameter="CompressSnapshotsToDisk" />
         </menu_item_check>
-        <menu_item_call
-         label="Save Texture As"
-         layout="topleft"
-         name="Save Texture As">
-            <menu_item_call.on_click
-             function="File.SaveTexture" />
-            <menu_item_call.on_enable
-             function="File.EnableSaveAs" />
-        </menu_item_call>
         <menu_item_separator
          layout="topleft" />
         <menu
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index f659062cfeb87cc47f0e33da805208e5038c7429..3e9cbe91e0973fdb749b5a0063a641ac7ffcfed0 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -100,11 +100,11 @@
    functor="GenericAcknowledge"
    icon="alertmodal.tga"
    name="MissingAlert"
-   label="Unknown Alert Message"
+   label="Unknown Notification Message"
    type="alertmodal">
-Your version of [APP_NAME] does not know how to display the alert it just received.  Please verify that you have the latest Viewer installed.
+Your version of [APP_NAME] does not know how to display the notification it just received.  Please verify that you have the latest Viewer installed.
 
-Error details: The alert called &apos;[_NAME]&apos; was not found in notifications.xml.
+Error details: The notification called &apos;[_NAME]&apos; was not found in notifications.xml.
     <usetemplate
      name="okbutton"
      yestext="OK"/>
@@ -1688,7 +1688,7 @@ This location can play streaming media.
 Streaming media requires a fast Internet connection.
 
 Play streaming media when available?
-(You can change this option later under Preferences &gt; Audio &amp; Video.)
+(You can change this option later under Preferences &gt; Privacy.)
     <usetemplate
      name="okcancelbuttons"
      notext="Disable"
@@ -3539,6 +3539,8 @@ Type a short announcement which will be sent to everyone in this region.
    type="alertmodal">
 The maturity rating for this region has been updated.
 It may take some time for the change to be reflected on the map.
+
+To enter Adult regions, residents must be Account Verified, either by age-verification or payment-verification.
   </notification>
 
   <notification
@@ -3797,21 +3799,6 @@ All reported abuses are investigated and resolved. You can view the resolution b
    <unique/>
   </notification>
 
-  <notification
-   icon="alertmodal.tga"
-   name="HelpReportAbuseEmailEO"
-   type="alertmodal">
-IMPORTANT: This report will go to the owner of the region you are currently in and not to Linden Lab.
-
-As a service to residents and visitors, the owner of the region you are in has elected to receive and resolve all reports originating in this region. Linden Lab will not investigate reports you file from this location.
-
-The region owner will resolve reports based on the local rules of this region as outlined in the estate Covenant.
-(View covenants by going to the World menu and selecting About Land.)
-
-The resolution of this report applies only to this Region. Residents&apos; access to other areas of [SECOND_LIFE] will not be affected by the outcome of this report. Only Linden Lab can restrict access to the entirety of [SECOND_LIFE].
-  <unique/>
-  </notification>
-
   <notification
    icon="alertmodal.tga"
    name="HelpReportAbuseSelectCategory"
@@ -4719,10 +4706,6 @@ The objects on the selected parcel that are NOT owned by you have been returned
    type="notify">
 Message from [NAME]:
 [MSG]
-    <usetemplate
-     name="okcancelbuttons"
-     notext="OK"
-     yestext="Inspect"/>
   </notification>
 
   <notification
@@ -5754,6 +5737,23 @@ You just entered a region using a different server version, which may affect per
 The SLurl you clicked on is not supported.
   </notification>
 
+  <notification
+   icon="notifytip.tga"
+   name="BlockedSLURL"
+   priority="high"
+   type="notifytip">
+A SLurl was received from an untrusted browser and has been blocked for your security.
+  </notification>
+
+  <notification
+   icon="notifytip.tga"
+   name="ThrottledSLURL"
+   priority="high"
+   type="notifytip">
+Multiple SLurls were received from an untrusted browser within a short period.
+They will be blocked for a few seconds for your security. 
+  </notification>
+
   <notification name="IMToast" type="notifytoast">
 [MESSAGE]
     <form name="form">
diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7657fb8055f32bb6f27a2c4c411baf4f186c6f49
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+  name="panel_activeim_row"
+  layout="topleft"
+  follows="left|right"
+  top="0"
+  left="0"
+  height="35"
+  width="318"
+  background_opaque="false"
+  background_visible="true"
+  bg_alpha_color="0.0 0.0 0.0 0.0" >
+  <string
+   name="unknown_obj">
+    Unknown Object
+  </string>
+  <chiclet_script
+    name="object_chiclet"
+    layout="topleft"
+    follows="left"
+    top="3"
+    left="5"
+    height="25"
+    width="25"
+    visible="false"
+    speaker.name="speaker_p2p"
+    speaker.width="20"
+    speaker.height="25"
+    speaker.left="25"
+    speaker.top="25"
+    speaker.auto_update="true"
+    speaker.draw_border="false"
+    speaker.visible="false">
+  </chiclet_script>
+  <chiclet_offer
+    name="inv_offer_chiclet"
+    layout="topleft"
+    follows="left"
+    top="3"
+    left="5"
+    height="25"
+    width="25"
+    visible="false"
+    speaker.name="speaker_p2p"
+    speaker.width="20"
+    speaker.height="25"
+    speaker.left="25"
+    speaker.top="25"
+    speaker.auto_update="true"
+    speaker.draw_border="false"
+    speaker.visible="false">
+  </chiclet_offer>
+	<text
+    type="string"
+    name="object_name"
+    layout="topleft"
+    top="10"
+    left_pad="20"
+    height="14"
+    width="245"
+    length="1"
+    follows="right|left"
+    use_ellipses="true"
+    font="SansSerifBold">
+    Unnamed Object
+  </text>
+  <button
+    top="10"
+    right="-5"
+    width="17"
+    height="17"
+    layout="topleft"
+    follows="right"
+    name="hide_btn"
+    mouse_opaque="true"
+    label=""
+    tab_stop="false"
+    image_unselected="Toast_CloseBtn"
+    image_selected="Toast_CloseBtn"
+  />
+</panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 7f847237ce4de908566fd18d79f75c87a55aa504..a41d492624bc48c72f3fb5ccd942416fdc81522f 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -324,6 +324,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
          min_width="34"
          user_resize="false">
             <chiclet_im_well
+             flash_period="0.3" 
              follows="right"
              height="23"
              layout="topleft"
@@ -331,6 +332,14 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
              name="im_well"
              top="4"
              width="34">
+             <!--
+Emulate 4 states of button by background images, see detains in EXT-3147. The same should be for notification_well button
+xml attribute           Description
+image_unselected        "Unlit" - there are no new messages
+image_selected          "Unlit" + "Selected" - there are no new messages and the Well is open
+image_pressed           "Lit" - there are new messages
+image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well is open
+             -->
                 <button
                  auto_resize="true"
                  flash_color="EmphasisColor"
@@ -339,10 +348,11 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
                  height="23"
                  image_overlay="Notices_Unread"
                  image_overlay_alignment="center" 
-                 image_pressed="PushButton_Press"
-                 image_pressed_selected="PushButton_Selected_Press"
+                 image_pressed="WellButton_Lit"
+                 image_pressed_selected="WellButton_Lit_Selected"
                  image_selected="PushButton_Selected_Press"
                  left="0"
+                 max_displayed_count="99"
                  name="Unread IM messages"
                  pad_left="0"
                  pad_right="0"
@@ -365,17 +375,19 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
          min_width="34"
          user_resize="false">
             <chiclet_notification
+             flash_period="0.25"
              follows="right"
              height="23"
              layout="topleft"
              left="0"
+             max_displayed_count="99"
              name="notification_well"
              top="4"
              width="34">
               <button
                  image_selected="PushButton_Selected_Press"
-                 image_pressed="PushButton_Press"
-		 image_pressed_selected="PushButton_Selected_Press"
+                 image_pressed="WellButton_Lit"
+                 image_pressed_selected="WellButton_Lit_Selected"
               auto_resize="true"
                halign="center"
                height="23"
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 e5dc4df0f817d829b033857f6a61c2f4abd98776..af73faf9a1d4315dfd8d9c517af1a9ae0a506001 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -23,7 +23,7 @@ Hover your mouse over the options for more help.
     </panel.string>
     <text_editor
      type="string"
-     follows="left|top"
+     follows="left|top|right"
      left="5"
      height="60"
      layout="topleft"
@@ -37,7 +37,7 @@ Hover your mouse over the options for more help.
     <name_list
      column_padding="0"
      draw_heading="true"
-     follows="left|top"
+     follows="left|top|right"
      heading_height="20"
      height="156"
      layout="topleft"
@@ -55,10 +55,10 @@ Hover your mouse over the options for more help.
          relative_width="0.4" />
       </name_list>
          <text
-         follows="left|top"
+         follows="left|top|right"
          type="string"
          height="12"
-         layout="topleft"
+         layout="left|top|right"
          left="5"
          name="active_title_label"
          top_pad="5"
@@ -66,7 +66,7 @@ Hover your mouse over the options for more help.
             My Title
         </text>
         <combo_box
-         follows="left|top"
+         follows="left|top|right"
          height="20"
          layout="topleft"
          left="5"
@@ -98,7 +98,7 @@ Hover your mouse over the options for more help.
          bevel_style="in"
          border="true"
          bg_alpha_color="FloaterUnfocusBorderColor"
-         follows="left|top"
+         follows="left|top|right"
          height="88"
          layout="topleft"
          left="2"
@@ -106,7 +106,7 @@ Hover your mouse over the options for more help.
          name="preferences_container"
          top_pad="2">
         <check_box
-         follows="right|top"
+         follows="right|top|left"
          height="16"
          label="Open enrollment"
          layout="topleft"
@@ -126,21 +126,21 @@ Hover your mouse over the options for more help.
          width="300" />
         <spinner
          decimal_digits="0"
-         follows="left|top"
+         follows="left|top|right"
          halign="left"
          height="16"
          increment="1"
          label_width="15"
          label="L$"
          layout="topleft"
-         right="-10"
+         right="-30"
          max_val="99999"
          left_pad="0"
          name="spin_enrollment_fee"
          tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."
-         width="100" />
+         width="80" />
          <combo_box
-         follows="left|top"
+         follows="left|top|right"
          height="20"
          layout="topleft"
          left="10"
@@ -158,7 +158,7 @@ Hover your mouse over the options for more help.
              value="Mature" />
         </combo_box>
         <check_box
-         follows="left|top"
+         follows="left|top|right"
          height="16"
          initial_value="true"
          label="Show in search"
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 22977b2274d97693449c84c207c6f351f94c79c6..c9db75b5d86c3c0d1efa26441bc55d409419bb39 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -1,211 +1,212 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
- follows="all"
- height="600"
- layout="topleft"
- left="0"
- name="panel_login"
- top="600"
+follows="all"
+height="600"
+layout="topleft"
+left="0"
+name="panel_login"
+top="600"
  width="996">
-    <panel.string
+<panel.string
      name="create_account_url">
-        http://join.secondlife.com/
-    </panel.string>
-    <panel.string
+       http://join.secondlife.com/
+</panel.string>
+<panel.string
      name="real_url">
-        http://secondlife.com/app/login/
-    </panel.string>
+       http://secondlife.com/app/login/
+</panel.string>
     <string name="reg_in_client_url">
-      http://secondlife.eniac15.lindenlab.com/reg-in-client/
-    </string>
-    <panel.string
+     http://secondlife.eniac15.lindenlab.com/reg-in-client/
+</string>
+<panel.string
      name="forgot_password_url">
-        http://secondlife.com/account/request.php
-    </panel.string>
-  <!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
-    <web_browser
-     border_visible="false"
-     bottom="600"
-     follows="all"
-     hide_loading="true"
-     left="0"
-     name="login_html"
-     start_url=""
-     top="0"
-     height="600"
+       http://secondlife.com/account/request.php
+</panel.string>
+<!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
+<web_browser
+border_visible="false"
+bottom="600"
+follows="all"
+hide_loading="true"
+left="0"
+name="login_html"
+start_url=""
+top="0"
+height="600"
      width="996" />
-    <panel
-     follows="left|bottom|right"
-     name="login_widgets"
-     layout="topleft"
-     top="519"
-     width="996"
+<panel
+follows="left|bottom|right"
+name="login_widgets"
+layout="topleft"
+top="519"
+width="996"
      height="80">
-    <text
-     follows="left|bottom"
-     font="SansSerifSmall"
-     height="16"
-     left="20"
-     name="first_name_text"
-     top="20"
-     width="150">
-        Name:
-    </text>
-    <line_editor
-     follows="left|bottom"
-     handle_edit_keys_directly="true"
-     height="22"
-     label="First"
-     left_delta="0"
-     max_length="31"
-     name="first_name_edit"
-     select_on_focus="true"
-     tool_tip="[SECOND_LIFE] First Name"
-     top_pad="0"
-     width="135" />
-    <line_editor
-     follows="left|bottom"
-     handle_edit_keys_directly="true"
-     height="22"
-     label="Last"
-     left_pad="8"
-     max_length="31"
-     name="last_name_edit"
-     select_on_focus="true"
-     tool_tip="[SECOND_LIFE] Last Name"
-     top_delta="0"
-     width="135" />
-     <text
-     follows="left|bottom"
-     font="SansSerifSmall"
-     height="15"
-     left_pad="8"
-     name="password_text"
-     top="20"
-     width="150">
-        Password:
-    </text>
-    <line_editor
-     follows="left|bottom"
-     handle_edit_keys_directly="true"
-     height="22"
-     left="304"
-     max_length="16"
-     name="password_edit"
-     select_on_focus="true"
-     top_pad="1"
-     width="135" />
-    <check_box
-     control_name="RememberPassword"
-     follows="left|bottom"
-     font="SansSerifSmall"
-     height="16"
-     label="Remember"
-     left_pad="20"
-     top="20"
-     name="remember_check"
-     width="150" />
-     <button
-     follows="left|bottom"
-     height="23"
-     image_unselected="PushButton_On"
-     image_selected="PushButton_On_Selected"
-     label="Log In"
-     label_color="White"
-     layout="topleft"
-     left="462"
-     name="connect_btn"
-     top="35"
-     width="90" />
-     <text
-     follows="right|bottom"
-     font="SansSerifSmall"
-     height="15"
-     halign="right"
-     left_pad="10"
-     right="-240"
-     name="start_location_text"
-     top="20"
-     width="130">
-        Starting location:
-    </text>
-    <combo_box
-     allow_text_entry="true"
-     control_name="LoginLocation"
-     follows="right|bottom"
-     height="23"
-     max_chars="128"
-     top_pad="0"
-     name="start_location_combo"
+<text
+follows="left|bottom"
+font="SansSerifSmall"
+height="16"
+left="20"
+name="first_name_text"
+top="20"
+width="150">
+First name:
+</text>
+<line_editor
+follows="left|bottom"
+handle_edit_keys_directly="true"
+height="22"
+label="First"
+left_delta="0"
+max_length="31"
+name="first_name_edit"
+select_on_focus="true"
+tool_tip="[SECOND_LIFE] First Name"
+top_pad="0"
+   width="135" />
+  <text
+   follows="left|bottom"
+   font="SansSerifSmall"
+   height="16"
+   left_pad="8"
+   name="last_name_text"
+   top="20"
+   width="150">
+    Last name:   </text>
+<line_editor
+follows="left|bottom"
+handle_edit_keys_directly="true"
+height="22"
+label="Last"
+max_length="31"
+name="last_name_edit"
+select_on_focus="true"
+tool_tip="[SECOND_LIFE] Last Name"
+  top_pad="0"
+  width="135" />
+<text
+follows="left|bottom"
+font="SansSerifSmall"
+height="15"
+left_pad="8"
+name="password_text"
+top="20"
+    width="150">
+       Password:
+</text>
+<line_editor
+follows="left|bottom"
+handle_edit_keys_directly="true"
+  height="22"
+  max_length="16"
+name="password_edit"
+select_on_focus="true"
+  top_pad="0"
+  width="135" />
+ <check_box
+control_name="RememberPassword"
+follows="left|bottom"
+font="SansSerifSmall"
+height="16"
+label="Remember"
+  top_pad="3"
+  name="remember_check"
+ width="135" />
+  <text
+  follows="left|bottom"
+  font="SansSerifSmall"
+  height="15"
+  left_pad="8"
+  name="start_location_text"
+top="20"
+  width="130">
+       Start at:
+ </text>
+<combo_box
+allow_text_entry="true"
+control_name="LoginLocation"
+  follows="left|bottom"
+  height="23"
+max_chars="128"
+top_pad="0"
+name="start_location_combo"
      width="135">
-        <combo_box.item
-         label="My last location"
-         name="MyLastLocation"
+<combo_box.item
+label="My last location"
+name="MyLastLocation"
          value="last" />
-        <combo_box.item
-         label="My home"
-         name="MyHome"
+<combo_box.item
+label="My home"
+name="MyHome"
          value="home" />
-        <combo_box.item
-         label="&lt;Type region name&gt;"
-         name="Typeregionname"
-         value="" />
-    </combo_box>
-    <combo_box
-     allow_text_entry="true"
-     font="SansSerifSmall"
-     follows="right|bottom"
-     height="23"
-     layout="topleft"
-     top_pad="2"
-     name="server_combo"
-     width="135"
-     visible="false" />
-    <text
-     follows="right|bottom"
-     font="SansSerifSmall"
-     text_color="EmphasisColor"
-     halign="right"
-     height="16"
-     top="12"
-     left_pad="5"
-     right="-10"
-     name="create_new_account_text"
-     width="180">
-        Sign up for account
-    </text>
-    <text
-     follows="right|bottom"
-     font="SansSerifSmall"
-     text_color="EmphasisColor"
-     halign="right"
-     height="16"
-     name="forgot_password_text"
-     top_pad="2"
-     width="180">
-        Forgot your name or password?
-    </text>
-    <text
-     follows="right|bottom"
-     font="SansSerifSmall"
-     text_color="EmphasisColor"
-     halign="right"
-     height="16"
-     name="login_help"
-     top_pad="2"
-     width="180">
-        Need help logging in?
-    </text>
-    <text
-     follows="right|bottom"
-     font="SansSerifSmall"
-     halign="right"
-     height="28"
-     top_pad="2"
-     name="channel_text"
-     width="180"
-     word_wrap="true">
-        [VERSION]
-    </text>
-  </panel>
+<combo_box.item
+label="&lt;Type region name&gt;"
+name="Typeregionname"   value="" />
+</combo_box>
+<combo_box
+allow_text_entry="true"
+font="SansSerifSmall"
+   follows="left|bottom"
+   height="23"
+layout="topleft"
+top_pad="2"
+name="server_combo"
+width="135"
+  visible="false" />
+<button
+  follows="left|bottom"
+  height="23"
+  image_unselected="PushButton_On"
+  image_selected="PushButton_On_Selected"
+  label="Log In"
+  label_color="White"
+  layout="topleft"
+  left_pad="15"
+  name="connect_btn"
+  top="35"
+  width="90" />
+ <text
+follows="right|bottom"
+font="SansSerifSmall"
+text_color="EmphasisColor"
+halign="right"
+height="16"
+top="12"
+left_pad="5"
+right="-10"
+name="create_new_account_text"
+  width="180">
+       Sign up
+ </text>
+<text
+follows="right|bottom"
+font="SansSerifSmall"
+text_color="EmphasisColor"
+halign="right"
+height="16"
+name="forgot_password_text"    top_pad="12"
+  width="180">
+       Forgot your name or password?
+</text>
+<text
+follows="right|bottom"
+font="SansSerifSmall"
+text_color="EmphasisColor"
+halign="right"
+height="16"
+name="login_help"
+top_pad="2"
+    width="180">
+       Need help logging in?   </text>
+<!--  <text
+    follows="right|bottom"
+    font="SansSerifSmall"
+    halign="right"
+    height="28"
+    top_pad="2"
+    name="channel_text"
+    width="180"
+    word_wrap="true">
+       [VERSION]
+   </text>-->
+</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index aeb28e4c605b4177868a17ff0b490c035f80c070..9990215dfd74d0ff99c63aeeda7269d46efaa6e8 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -16,43 +16,44 @@
     <filter_editor
      text_pad_left="14"
      follows="left|top|right"
-	 font="SanSerif"
-     height="20"
+	height="23"
      label="Filter"
      layout="topleft"
      left="15"
+max_length="300"
      name="inventory search editor"
-     top="34"
-     width="300" />
+     top="26"
+     width="303" />
     <tab_container
-     follows="left|top|right|bottom"
+follows="all"
+halign="center"
      height="300"
      layout="topleft"
      left_delta="-4"
      name="inventory filter tabs"
-     tab_min_width="70"
      tab_height="30"
      tab_position="top"
-     top_pad="10"
-     halign="center"
+     tab_min_width="100"
+     top_pad="4"
      width="305">
         <inventory_panel
-         follows="left|top|right|bottom"
+	border="false"
+         follows="all"
          height="295"
-         label="ALL ITEMS"
+         label="MY INVENTORY"
          layout="topleft"
-         left="1"
+         left="0"
          name="All Items"
          top="16"
          width="290" />
         <inventory_panel
-         follows="left|top|right|bottom"
+	border="false"
+         follows="all"
          height="295"
-         label="RECENT ITEMS"
+         label="RECENT"
          layout="topleft"
          left_delta="0"
          name="Recent Items"
-         top_delta="0"
          width="290" />
     </tab_container>
 
@@ -109,12 +110,12 @@
     <menu_bar
      bg_visible="false"
      follows="left|top|right"
-     height="18"
+     height="20"
      layout="topleft"
-     left_delta="0"
+     left="10"
      mouse_opaque="false"
      name="Inventory Menu"
-     top="15"
+     top="0"
 	 visible="true"
      width="290">
         <menu
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
index c02dabed2c160ae8897dfc9b2124f9d501acb206..9e7c9477d4616e1754d7c3f87a73196566b0983d 100644
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ b/indra/newview/skins/default/xui/en/panel_notes.xml
@@ -120,6 +120,7 @@
          left="0"
          mouse_opaque="false"
          name="add_friend"
+         tool_tip="Offer friendship to the resident"
          top="5"
          width="55" />
         <button
@@ -128,6 +129,7 @@
          label="IM"
          layout="topleft"
          name="im"
+         tool_tip="Open instant message session"
          top="5"
          left_pad="5"
          width="40" />
@@ -137,6 +139,7 @@
          label="Call"
          layout="topleft"
          name="call"
+         tool_tip="Call this resident"
          left_pad="5"
          top="5"
          width="55" />
@@ -147,6 +150,7 @@
          label="Map"
          layout="topleft"
          name="show_on_map_btn"
+         tool_tip="Show the resident on the map"
          top="5"
          left_pad="5"
          width="50" />
@@ -156,6 +160,7 @@
          label="Teleport"
          layout="topleft"
          name="teleport"
+         tool_tip="Offer teleport"
          left_pad="5"
          top="5"
          width="90" />
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index 0567d722d5c13a8a9a5e190bbcff6f27b1386820..db95d01b43503b02e036101f3cc20341e226ba4f 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -1,46 +1,48 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel name="Outfits"
- follows="all"
-border="false">
+       height="510"
+   width="333"
+      follows="top|left"
+             left="0"
+	     top_pad="0">
     <accordion
      single_expansion="true"
-      follows="top|left|bottom"
-      height="460"
-      layout="topleft"
-     left="0"
+     height="510"
+             layout="topleft"
+             left="0"
+      follows="top|left"
      name="outfits_accordion"
-     top="0"
-     width="333">
+	     top_pad="0"
+             width="333">
      <accordion_tab
-         layout="topleft"
+            expanded="false"
+            layout="topleft"
          name="tab_cof"
          title="Current Outfit">
 	 <inventory_panel
-	 	 allow_multi_select="true"
-		 border="false"
-		 bottom="0"
-	         follows="all"
-		 height="416"
-		 left="0"
+	    allow_multi_select="true"
+	    border="false"
+            height="460"
+	     left="0"
+             top="0"
 		 mouse_opaque="true"
 	         name="cof_accordionpanel"
-		 width="333"
 		 start_folder="Current Outfit" />
         </accordion_tab>
         <accordion_tab
-         layout="topleft"
+            expanded="true"
+            layout="topleft"
          name="tab_outfits"
          title="My Outfits">
 	 <inventory_panel
 	 	 allow_multi_select="true"
 		 border="false"
-		 bottom="0"
 	     follows="all"
-		 height="415"
 		 left="0"
+             top="0"
+            height="460"
 		 mouse_opaque="true"
 	     name="outfitslist_accordionpanel"
-		 width="333"
 		 start_folder="My Outfits" />
         </accordion_tab>
 	</accordion>
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 6a61953319befdb1f2d9e40420192d5f8a53a96c..78b90eefcca3e447fc3f0102e7ec30e5ef12e898 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -70,7 +70,7 @@
     </text>
     <combo_box
      allow_text_entry="true"
-     height="20"
+     height="23"
      follows="left|top"
      layout="topleft"
      left_pad="0"
@@ -306,7 +306,7 @@ Avatars:
     <button
      follows="top|left"
      enabled_control="EnableVoiceChat"
-     height="20"
+     height="23"
      label="Set Key"
      left_delta="0"
      name="set_voice_hotkey_button"
@@ -320,7 +320,7 @@ Avatars:
      enabled_control="EnableVoiceChat"
      follows="left"
      halign="center"
-     height="20"
+     height="23"
      label="Middle Mouse Button"
      left_delta="120"
      mouse_opaque="true"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
index a94df4150da43eacfce0a30c66b15106dc3e931d..18d0f8acabfb5472e5c24d3164de12daefc6dba3 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
@@ -50,7 +50,7 @@
      name="show_label"
      top_pad="14"
      width="450">
-        Always show these alerts:
+        Always show these notifications:
     </text>
     <scroll_list
      follows="top|left"
@@ -63,7 +63,7 @@
 	 <button
 	 enabled_control="FirstSelectedDisabledPopups"
      follows="top|left"
-     height="20"
+     height="23"
      image_disabled="PushButton_Disabled"
      image_disabled_selected="PushButton_Disabled"
      image_overlay="Arrow_Up"
@@ -81,7 +81,7 @@
     <button
 	 enabled_control="FirstSelectedEnabledPopups"
 	 follows="top|left"
-     height="20"
+     height="23"
      image_disabled="PushButton_Disabled"
      image_disabled_selected="PushButton_Disabled"
      image_overlay="Arrow_Down"
@@ -107,7 +107,7 @@
      name="dont_show_label"
      top_pad="10"
      width="450">
-        Never show these alerts:
+        Never show these notifications:
     </text>
     <scroll_list
      follows="top|left"
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 ee9bfbae93f16266e7814a9cd0a139832c91ebd7..b5c6b637e5116216d6985d272a3d65f6da5fab6d 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -24,7 +24,7 @@
     <combo_box
      control_name="Language"
      follows="left|bottom"
-     height="18"
+     height="23"
      layout="topleft"
      left_delta="50"
      max_chars="135"
@@ -92,11 +92,7 @@
          name="(Japanese)"
          value="ja" />
 
-        <combo_box.item
-         enabled="true"
-         label="Test Language"
-         name="TestLanguage"
-         value="test" />
+
     </combo_box>
     <text
      type="string"
@@ -136,7 +132,7 @@
     <combo_box
      control_name="PreferredMaturity"
      follows="left|bottom"
-     height="18"
+     height="23"
      layout="topleft"
      left_delta="-10"
      name="maturity_desired_combobox"
@@ -170,7 +166,7 @@
     <combo_box
      control_name="LoginLocation"
      follows="left|bottom"
-     height="18"
+     height="23"
      layout="topleft"
      left_delta="50"
      name="start_location_combo"
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 eb00b9b79a0490349ab60649a3d5565c4baa23db..04985d0fa982ad251ed75c76a6bcdd567715c184 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -708,7 +708,7 @@
 	</panel>	
         <button
      follows="left|bottom"
-     height="20"
+     height="23"
      label="Apply"
      label_selected="Apply"
      layout="topleft"
@@ -721,7 +721,7 @@
     </button>
     <button
      follows="left|bottom"
-     height="20"
+     height="23"
      label="Reset"
      layout="topleft"
      left_pad="3"
@@ -734,7 +734,7 @@
     <button
      control_name="ShowAdvancedGraphicsSettings"
      follows="right|bottom"
-     height="20"
+     height="23"
      is_toggle="true"
      label="Advanced"
      layout="topleft"
@@ -744,7 +744,7 @@
      width="115" />
     <button
      follows="right|bottom"
-     height="20"
+     height="23"
      label="Hardware"
      label_selected="Hardware"
      layout="topleft"
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 29e9b476eb70a8dadb6f66d09f57f01d19a36e03..25d7ba0903f193f5a8ba293157ae0970c0d3fba0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -15,7 +15,7 @@
     </panel.string>
     <button
      follows="left|bottom"
-     height="20"
+     height="23"
      label="Clear History"
      layout="topleft"
      left="30"
@@ -160,7 +160,7 @@
     <button
 	 enabled="false"
      follows="right|bottom"
-     height="20"
+     height="23"
      label="Browse"
      label_selected="Browse"
      layout="topleft"
@@ -173,7 +173,7 @@
     </button>
     <button
      follows="left|bottom"
-     height="20"
+     height="23"
      label="Block list"
      layout="topleft"
      left="30"
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 5cabae5fa0111691c609627757a0fbff624ac5a5..a7def5306e33ba9b3c6b0e6d62487b5ab9e121d3 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -10,7 +10,7 @@
  top="1"
  width="517">
     <button
-     height="20"
+     height="23"
      label="Other Devices"
      layout="topleft"
      left="30"
@@ -138,7 +138,7 @@
      enabled_control="BrowserProxyEnabled"
 	 decimal_digits="0"
      follows="left|top"
-     height="16"
+     height="23"
      increment="1"
      initial_value="80"
      label="Port number:"
@@ -208,7 +208,7 @@
      width="205" />
     <button
      follows="left|top"
-     height="22"
+     height="23"
      label="Browse"
      label_selected="Browse"
      layout="topleft"
@@ -221,7 +221,7 @@
     </button>
    <button
      follows="left|top"
-     height="22"
+     height="23"
      label="Reset"
      label_selected="Set"
      layout="topleft"
@@ -314,7 +314,7 @@
      width="200" />
     <button
      follows="left|top"
-     height="22"
+     height="23"
      enabled="false"
      label="Browse"
      label_selected="Browse"
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 854227619b522fc3c755c4ef71109e8c59ccaaa8..5332007bafaca34268828d8bfd33ce7f0cfa2330 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -343,7 +343,7 @@
   <button
    control_name="ShowDeviceSettings"
    follows="left|top"
-   height="19"
+   height="23"
    is_toggle="true"
    label="Input/Output devices"
    layout="topleft"
@@ -391,7 +391,7 @@
         Input
     </text>
     <combo_box
-     height="19"
+     height="23"
      control_name="VoiceInputAudioDevice"
      layout="topleft"
      left="165"
@@ -399,31 +399,6 @@
      name="voice_input_device"
      top_pad="0"
      width="200" />
-   <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="16"
-     layout="topleft"
-     left="165"
-     name="My volume label"
-     top_pad="10"
-     width="200">
-        My volume:
-    </text>
-      <slider_bar
-        control_name="AudioLevelMic"
-     follows="left|top"
-     height="17"
-     increment="0.05"
-     initial_value="1.0"
-     layout="topleft"
-     left="160"
-     max_val="2"
-     name="mic_volume_slider"
-     tool_tip="Change the volume using this slider"
-     top_pad="0"
-     width="220" />
     <text
      type="string"
      text_color="EmphasisColor"
@@ -433,7 +408,7 @@
      layout="topleft"
      left_pad="5"
      name="wait_text"
-     top_delta="0"
+     top_delta="5"
      width="110">
         Please wait
     </text>
@@ -442,7 +417,7 @@
      layout="topleft"
      left_delta="0"
      name="bar0"
-     top_delta="5"
+     top_delta="-5"
      width="20" />
     <locate
      height="20"
@@ -472,23 +447,13 @@
      name="bar4"
      top_delta="0"
      width="20" />
-  <!--  <text
-     type="string"
-     height="37"
-     left="30"
-     name="voice_intro_text1"
-     top_pad="-4"
-     width="410"
-     word_wrap="true">
-        Adjust the slider to control how loud you sound to other people. To test your volume, simply speak into your microphone
-    </text>-->
           <icon
              height="18"
              image_name="Parcel_Voice_Light"
              left="80"
              name="speaker_icon"
              mouse_opaque="false"
-             top_pad="-8"
+             top_pad="4"
              visible="true"
              width="22" />
     <text
@@ -505,7 +470,7 @@
     </text>
     <combo_box
      control_name="VoiceOutputAudioDevice"
-     height="19"
+     height="23"
      layout="topleft"
      left="165"
      max_chars="128"
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 6be203ef9cc5791f7775cf1b4bedb27f32f5adea..638bc3cabd753b18406da380ae044280b2f12f80 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -286,6 +286,7 @@
          left="0"
          mouse_opaque="false"
          name="add_friend"
+         tool_tip="Offer friendship to the resident"
          top="5"
          width="77" />
         <button
@@ -294,6 +295,7 @@
          label="IM"
          layout="topleft"
          name="im"
+         tool_tip="Open instant message session"
          top="5"
          left_pad="5"
          width="33" />
@@ -303,6 +305,7 @@
          label="Call"
          layout="topleft"
          name="call"
+         tool_tip="Call this resident"
          left_pad="5"
          top="5"
          width="40" />
@@ -313,6 +316,7 @@
          label="Map"
          layout="topleft"
          name="show_on_map_btn"
+         tool_tip="Show the resident on the map"
          top="5"
          left_pad="5"
          width="44" />
@@ -322,6 +326,7 @@
          label="Teleport"
          layout="topleft"
          name="teleport"
+         tool_tip="Offer teleport"
          left_pad="5"
          top="5"
          width="67" />
@@ -331,6 +336,7 @@
          label="â–¼"
          layout="topleft"
          name="overflow_btn"
+         tool_tip="Pay money to or share inventory with the resident"
          right="-1"
          top="5"
          width="21" />
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index e25ff0d548503e4c47db38b5f0d277bebd58c468..f381c5c21354469bf0881f19db8f3400baa6426c 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -9,10 +9,6 @@
  name="Estate"
  top="320"
  width="480">
-    <panel.string
-     name="email_unsupported">
-        Feature unsupported
-    </panel.string>
     <text
      type="string"
      length="1"
@@ -81,7 +77,7 @@ regions in the estate.
     <view_border
      bevel_style="in"
      follows="top|left"
-     height="310"
+     height="270"
      layout="topleft"
      left_delta="-4"
      top_pad="5"
@@ -141,12 +137,12 @@ regions in the estate.
      name="Only Allow"
      top="250"
      width="278">
-        Restrict Access To:
+        Restrict Access to Accounts Verified by:
     </text>
     <check_box
      follows="top|left"
      height="16"
-     label="Residents with payment info on file"
+     label="Payment Information on File"
      layout="topleft"
      left_delta="0"
      name="limit_payment"
@@ -156,7 +152,7 @@ regions in the estate.
     <check_box
      follows="top|left"
      height="16"
-     label="Age-verified adults"
+     label="Age Verification"
      layout="topleft"
      left_delta="0"
      name="limit_age_verified"
@@ -179,26 +175,6 @@ regions in the estate.
      name="allow_direct_teleport"
      top_pad="4"
      width="80" />
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="20"
-     layout="topleft"
-     left="15"
-     name="abuse_email_text"
-     top_pad="10"
-     width="180">
-        Abuse email address:
-    </text>
-    <line_editor
-     follows="top|left"
-     height="23"
-     layout="topleft"
-     left="15"
-     name="abuse_email_address"
-     top_pad="-5"
-     width="230" />
     <button
      enabled="false"
      follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml
index b89a975430a4792364138a87ce1d709d5bf38811..a6036f8b781b20604fc52e33fab18f257e1cda63 100644
--- a/indra/newview/skins/default/xui/en/role_actions.xml
+++ b/indra/newview/skins/default/xui/en/role_actions.xml
@@ -4,39 +4,39 @@
 	     description="These Abilities include powers to add and remove group Members, and allow new Members to join without an invitation."
 	     name="Membership">
 		<action description="Invite People to this Group"
-		     longdescription="Invite People to this Group using the &apos;Invite New Person...&apos; button in the Members &amp; Roles tab &gt; Members sub-tab."
+		     longdescription="Invite People to this Group using the &apos;Invite&apos; button in the Roles section &gt; Members tab."
 		     name="member invite" value="1" />
 		<action description="Eject Members from this Group"
-		     longdescription="Eject Members from this Group using the &apos;Eject From Group&apos; button in the Members &amp; Roles tab &gt; Members sub-tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability."
+		     longdescription="Eject Members from this Group using the &apos;Eject&apos; button in the Roles section &gt; Members tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability."
 		     name="member eject" value="2" />
 		<action
-		     description="Toggle &apos;Open Enrollment&apos; and change &apos;Signup Fee&apos;"
-		     longdescription="Toggle &apos;Open Enrollment&apos; to let new Members join without an invitation, and change &apos;Signup Fee&apos; in the Group Preferences section of the General tab."
+		     description="Toggle &apos;Open Enrollment&apos; and change &apos;Enrollment fee&apos;"
+		     longdescription="Toggle &apos;Open Enrollment&apos; to let new Members join without an invitation, and change the &apos;Enrollment fee&apos; in the General section."
 		     name="member options" value="3" />
 	</action_set>
 	<action_set
 	     description="These Abilities include powers to add, remove, and change group Roles, add and remove Members in Roles, and assign Abilities to Roles."
 	     name="Roles">
 		<action description="Create new Roles"
-		     longdescription="Create new Roles in the Members &amp; Roles tab &gt; Roles sub-tab."
+		     longdescription="Create new Roles in the Roles section &gt; Roles tab."
 		     name="role create" value="4" />
 		<action description="Delete Roles"
-		     longdescription="Delete Roles in the Members &amp; Roles tab &gt; Roles sub-tab."
+		     longdescription="Delete Roles in the Roles section &gt; Roles tab."
 		     name="role delete" value="5" />
-		<action description="Change Role names, titles, descriptions, and whether Role members are publicly visible"
-		     longdescription="Change Role names, titles, descriptions, and whether Role members are publicly visible. This is done at the bottom of the the Members &amp; Roles tab &gt; Roles sub-tab after selecting a Role."
+		<action description="Change Role names, titles, descriptions, and whether Role members are publicly revealed"
+		     longdescription="Change Role names, titles, descriptions, and whether Role members are publicly revealed. This is done at the bottom of the the Roles section &gt; Roles tab after selecting a Role."
 		     name="role properties" value="6" />
 		<action description="Assign Members to Assigner&apos;s Roles"
-		     longdescription="Assign Members to Roles in the Assigned Roles section of the Members &amp; Roles tab &gt; Members sub-tab. A Member with this Ability can only add Members to a Role the assigner is already in."
+		     longdescription="Assign Members to Roles in the list of Assigned Roles (Roles section &gt; Members tab). A Member with this Ability can only add Members to a Role that the assigner is already in."
 		     name="role assign member limited" value="7" />
 		<action description="Assign Members to Any Role"
-		     longdescription="Assign Members to Any Role in the Assigned Roles section of the Members &amp; Roles tab &gt; Members sub-tab. *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
+		     longdescription="Assign Members to Any Role in the list of Assigned Roles (Roles section &gt; Members tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
 		     name="role assign member" value="8" />
 		<action description="Remove Members from Roles"
-		     longdescription="Remove Members from Roles in the Assigned Roles section of the Members &amp; Roles tab &gt; Members sub-tab. Owners can&apos;t be removed."
+		     longdescription="Remove Members from Roles in the list of Assigned Roles (Roles section &gt; Members tab). Owners can&apos;t be removed."
 		     name="role remove member" value="9" />
 		<action description="Assign and Remove Abilities in Roles"
-		     longdescription="Assign and Remove Abilities in Roles in the Allowed Abilities section of the Members &amp; Roles tab &gt; Roles sub-tab. *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
+		     longdescription="Assign and Remove Abilities for each Role in the list of Allowed Abilities (Roles section &gt; Roles tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
 		     name="role change actions" value="10" />
 	</action_set>
 	<action_set
@@ -44,11 +44,11 @@
 	     name="Group Identity">
 		<action
 		     description="Change Charter, Insignia, and &apos;Show in search&apos;"
-		     longdescription="Change Charter, Insignia, and &apos;Show in search&apos;. This is done in the General tab."
+		     longdescription="Change Charter, Insignia, and &apos;Show in search&apos;. This is done in the General section."
 		     name="group change identity" value="11" />
 	</action_set>
 	<action_set
-	     description="These Abilities include powers to deed, modify, and sell land in this group&apos;s land holdings. To get to the About Land window, right-click the ground and select &apos;About Land...&apos;, or click the parcel info in the menu bar."
+	     description="These Abilities include powers to deed, modify, and sell land in this group&apos;s land holdings. To get to the About Land window, right-click the ground and select &apos;About Land&apos;, or click the &apos;i&apos; icon in the Navigation Bar."
 	     name="Parcel Management">
 		<action description="Deed land and buy land for group"
 		     longdescription="Deed land and buy land for group. This is done in About Land &gt; General tab."
@@ -60,18 +60,18 @@
 		     longdescription="Set land for sale info. *WARNING* Any Member in a Role with this Ability can sell group-owned land in About Land &gt; General tab as they wish! Be sure you know what you&apos;re doing before assigning this Ability."
 		     name="land set sale info" value="14" />
 		<action description="Subdivide and join parcels"
-		     longdescription="Subdivide and join parcels. This is done by right-clicking the ground, &apos;Edit Terrain&apos;, and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click &apos;Subdivide...&apos;. To join, select two or more contiguous parcels and click &apos;Join...&apos;. "
+		     longdescription="Subdivide and join parcels. This is done by right-clicking the ground, &apos;Edit Terrain&apos;, and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click &apos;Subdivide&apos;. To join, select two or more contiguous parcels and click &apos;Join&apos;. "
 		     name="land divide join" value="15" />
 	</action_set>
 	<action_set
 	     description="These Abilities include powers to change the parcel name and publish settings, Find directory visibility, and landing point &amp; TP routing options."
 	     name="Parcel Identity">
-		<action description="Toggle &apos;Show in Find Places&apos; and set category"
-		     longdescription="Toggle &apos;Show in Find Places&apos; and setting a parcel&apos;s category in About Land &gt; Options tab."
+		<action description="Toggle &apos;Show Place in Search&apos; and set category"
+		     longdescription="Toggle &apos;Show Place in Search&apos; and setting a parcel&apos;s category in About Land &gt; Options tab."
 		     name="land find places" value="17" />
 		<action
-		     description="Change parcel name, description, and &apos;Show in search&apos; settings"
-		     longdescription="Change parcel name, description, and &apos;Show in search&apos; settings. This is done in About Land &gt; Options tab."
+		     description="Change parcel name, description, and &apos;Show Place in Search&apos; settings"
+		     longdescription="Change parcel name, description, and &apos;Show Place in Search&apos; settings. This is done in About Land &gt; Options tab."
 		     name="land change identity" value="18" />
 		<action description="Set landing point and set teleport routing"
 		     longdescription="On a group-owned parcel, Members in a Role with this Ability can set a landing point to specify where incoming teleports arrive, and also set teleport routing for further control. This is done in About Land &gt; Options tab."
@@ -87,7 +87,7 @@
 		     longdescription="Toggle &apos;Edit Terrain&apos;. *WARNING* About Land &gt; Options tab &gt; Edit Terrain allows anyone to terraform your land&apos;s shape, and place and move Linden plants. Be sure you know what you&apos;re doing before assigning this Ability. Editing terrain is toggled in About Land &gt; Options tab."
 		     name="land edit" value="21" />
 		<action description="Toggle various About Land &gt; Options settings"
-		     longdescription="Toggle &apos;Safe (no damage)&apos;, &apos;Fly&apos;, and allow other Residents to: &apos;Create Objects&apos;, &apos;Edit Terrain&apos;, &apos;Create Landmarks&apos;, and &apos;Run Scripts&apos; on group-owned land in About Land &gt; Options tab."
+		     longdescription="Toggle &apos;Safe (no damage)&apos;, &apos;Fly&apos;, and allow other Residents to: &apos;Edit Terrain&apos;, &apos;Build&apos;, &apos;Create Landmarks&apos;, and &apos;Run Scripts&apos; on group-owned land in About Land &gt; Options tab."
 		     name="land options" value="22" />
 	</action_set>
 	<action_set
@@ -106,7 +106,7 @@
 		     longdescription="Members in a Role with this Ability can landmark a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab."
 		     name="land allow landmark" value="26" />
 		<action description="Allow &apos;Set Home to Here&apos; on group land"
-		     longdescription="Members in a Role with this Ability can use World menu &gt; Set Home to Here on a parcel deeded to this group."
+		     longdescription="Members in a Role with this Ability can use World menu &gt; Landmarks &gt; Set Home to Here on a parcel deeded to this group."
 		     name="land allow set home" value="28" />
 	</action_set>
 	<action_set
@@ -116,13 +116,13 @@
 		     longdescription="Manage parcel Access lists in About Land &gt; Access tab."
 		     name="land manage allowed" value="29" />
 		<action description="Manage parcel Ban lists"
-		     longdescription="Manage parcel Ban lists in About Land &gt; Ban tab."
+		     longdescription="Manage parcel Ban lists in About Land &gt; Access tab."
 		     name="land manage banned" value="30" />
-		<action description="Change parcel &apos;Sell passes...&apos; settings"
-		     longdescription="Change parcel &apos;Sell passes...&apos; settings in About Land &gt; Access tab."
+		<action description="Change parcel &apos;Sell passes to&apos; settings"
+		     longdescription="Change parcel &apos;Sell passes to&apos; settings in About Land &gt; Access tab."
 		     name="land manage passes" value="31" />
 		<action description="Eject and freeze Residents on parcels"
-		     longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, More &gt;, and selecting &apos;Eject...&apos; or &apos;Freeze...&apos;."
+		     longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, then selecting &apos;Eject&apos; or &apos;Freeze&apos;."
 		     name="land admin" value="32" />
 	</action_set>
 	<action_set
@@ -138,20 +138,20 @@
 		     longdescription="Return objects on group-owned parcels that are non-group in About Land &gt; Objects tab."
 		     name="land return non group" value="34" />
 		<action description="Landscaping using Linden plants"
-		     longdescription="Landscaping ability to place and move Linden trees, plants, and grasses. These items can be found in your inventory&apos;s Library &gt; Objects folder or they can be created via the Build button."
+		     longdescription="Landscaping ability to place and move Linden trees, plants, and grasses. These items can be found in your inventory&apos;s Library &gt; Objects folder, or they can be created via the Build menu."
 		     name="land gardening" value="35" />
 	</action_set>
 	<action_set
-	     description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Edit Tools &gt; General Tab. Right-click an object and Edit to see its settings. "
+	     description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Build Tools &gt; General tab. Right-click an object and Edit to see its settings. "
 	     name="Object Management">
 		<action description="Deed objects to group"
-		     longdescription="Deed objects to group in the Edit Tools &gt; General Tab."
+		     longdescription="Deed objects to group in the Build Tools &gt; General tab."
 		     name="object deed" value="36" />
 		<action description="Manipulate (move, copy, modify) group-owned objects"
-		     longdescription="Manipulate (move, copy, modify) group-owned objects in the Edit Tools &gt; General Tab."
+		     longdescription="Manipulate (move, copy, modify) group-owned objects in the Build Tools &gt; General tab."
 		     name="object manipulate" value="38" />
 		<action description="Set group-owned objects for sale"
-		     longdescription="Set group-owned objects for sale in the Edit Tools &gt; General tab."
+		     longdescription="Set group-owned objects for sale in the Build Tools &gt; General tab."
 		     name="object set sale" value="39" />
 	</action_set>
 	<action_set
@@ -165,10 +165,10 @@
 	     description="These Abilities include powers to allow Members to send, receive, and view group Notices."
 	     name="Notices">
 		<action description="Send Notices"
-		     longdescription="Members in a Role with this Ability can send Notices in Group Information &gt; Notices tab."
+		     longdescription="Members in a Role with this Ability can send Notices via the Group &gt; Notices section."
 		     name="notices send" value="42" />
 		<action description="Receive Notices and view past Notices"
-		     longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group Information &gt; Notices tab."
+		     longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group &gt; Notices section."
 		     name="notices receive" value="43" />
 	</action_set>
 	<action_set
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 886887c2b50ac4c4235a901f4854ab5399b312cc..3dac1a96140ee385511d5af6376c6da19097a8fe 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -1,177 +1,170 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
 background_visible="true"
- follows="all"
- height="570"
-  label="My Appearance"
-  layout="topleft"
- min_height="350"
-  name="appearance panel"
- width="333">
- <string
-name="No Outfit"
-value="No Outfit" />
-<panel
- left="0"
- top="0"
- follows="top|left"
+follows="all"
+height="635"
+label="Outfits"
 layout="topleft"
- width="333"
- height="45"
- background_visible="true"
- background_opaque="false"
- bg_alpha_color="MouseGray"
- name="panel_currentlook"
- >
-<button
-   follows="left|top"
-        top="0"  width="1" height="1"
-        layout="topleft"
-	left="0"
-        name="editappearance_btn" />
-   <button
-   follows="left|top"
-        top="0"  width="1" height="1"
-        layout="topleft"
-	left="3"
- name="openoutfit_btn" />
-<icon
- follows="top|left"
- height="30"
- image_name="TabIcon_Appearance_Off"
- name="outfit_icon"
- mouse_opaque="false"
- visible="true"
- left="5"
- top="0"
- width="30" />
-<text
- width="292"
- height="22"
-follows="top|left"
- layout="topleft"
- left_pad="5"
-font="SansSerifLarge"
-font.style="BOLD"
-word_wrap="false"
-use_ellipses="true"
-mouse_opaque="false"
- text_color="white"
- name="currentlook_name">
-MyOutfit With a really Long Name like MOOSE
-    </text>
-  <text
-width="290"
-left="40"
-height="1"
-follows="top|left"
- layout="topleft"
- top_pad="-2"
-mouse_opaque="false"
- name="currentlook_title" >
-(now wearing)
-  </text>
-</panel>
-    <filter_editor
-     follows="top|left"
-     height="23"
-     layout="topleft"
-     left="15"
-     label="Filter"
-     max_length="300"
-     name="Filter"
-     top_pad="7"
-     width="303" />
-    <panel
-     follows="top|left"
-     halign="center"
-     height="500"
-     layout="topleft"
-    class="panel_outfits_inventory"
-      filename="panel_outfits_inventory.xml"
-      name="panel_outfits_inventory"
-     min_height="300"
+min_height="460"
+name="appearance panel"
+top="0"
+left="0"
+   width="333">
+   <string
+   name="No Outfit"
+   value="No Outfit" />
+   <panel
+   left="0"
+   top="0"
+   follows="left|top|right"
+   layout="topleft"
+   width="333"
+   height="33"
+   name="panel_currentlook"
+   >
+      <button
+      follows="left|top"
+      top="0"  width="1" height="1"
+      layout="topleft"
+      left="0"
+      name="editappearance_btn" />
+      <button
+      follows="left|top"
+      top="0"  width="1" height="1"
+      layout="topleft"
       left="0"
-      top_pad="3"
-	width="333"
-       />
+      name="openoutfit_btn" />
+      <icon
+      follows="top|left"
+      height="30"
+      image_name="TabIcon_Appearance_Off"
+      name="outfit_icon"
+      mouse_opaque="false"
+      visible="true"
+      left="5"
+      top="0"
+      width="30" />
+      <text
+      font="SansSerifHuge"
+      height="20"
+      left_pad="5"
+      text_color="white"
+      top="3"
+      use_ellipses="true"
+      width="290"
+      follows="top|left"
+      word_wrap="true"
+      mouse_opaque="false"
+      name="currentlook_name">
+      MyOutfit With a really Long Name like MOOSE
+      </text>
+      <!-- <text
+      text_color="LtGray_50"
+      width="290"
+      left="40"
+      height="1"
+      follows="top|left"
+      layout="topleft"
+      top_pad="-2"
+      mouse_opaque="false"
+      name="currentlook_title" >
+      (current outfit)
+      </text>-->
+   </panel>
+   <filter_editor
+   height="23"
+   follows="left|top|right"
+   layout="topleft"
+   left="15"
+   label="Filter Outfits"
+   max_length="300"
+   name="Filter"
+   top_pad="0"
+   width="303" />
    <panel
-     background_visible="true"
-     follows="top|left"
-     height="19"
-     layout="topleft"
-     left="0"
-     visible="true"
-     name="bottom_panel"
-     width="333">
-        <button
-         follows="bottom|left"
-         tool_tip="Show additional options"
-         height="18"
-         image_disabled="OptionsMenu_Disabled"
-         image_selected="OptionsMenu_Press"
-         image_unselected="OptionsMenu_Off"
-         layout="topleft"
-         left="10"
-         name="options_gear_btn"
-         top="6"
-         width="18" />
-        <button
-         follows="bottom|left"
-         height="18"
-         image_selected="AddItem_Press"
-         image_unselected="AddItem_Off"
-         image_disabled="AddItem_Disabled"
-         layout="topleft"
-         left_pad="5"
-         name="add_btn"
-         tool_tip="Add new item"
-         width="18" />
-        <dnd_button
-         follows="bottom|left"
-         height="18"
-         image_selected="TrashItem_Press"
-         image_unselected="TrashItem_Off"
-         layout="topleft"
-         right="-5"
-         name="trash_btn"
-         tool_tip="Remove selected item"
-         top="6"
-         width="18" />
-    <button
-     follows="top|left"
-       height="23"
-       label="Wear"
+   class="panel_outfits_inventory"
+   filename="panel_outfits_inventory.xml"
+   name="panel_outfits_inventory"
+   height="510"
+   min_height="510"
+   width="333"
+   top_pad="0"
+   follows="top|left"
+   />
+   <panel
+   visible="true"
+   name="bottom_panel"
+   height="50"
+   left="0"
+   top_pad="3"
+   follows="bottom|left"
+   width="333">
+      <button
+       follows="bottom|left"
+       tool_tip="Show additional options"
+       height="18"
+       image_disabled="OptionsMenu_Disabled"
+       image_selected="OptionsMenu_Press"
+       image_unselected="OptionsMenu_Off"
        layout="topleft"
-       name="wear_btn"
-       right="-5"
-       top_pad="0"
-        width="90" />
-    </panel>
- <!--   <button
-     follows="bottom|left"
-       height="23"
-       label="New outfit"
+       left="10"
+       name="options_gear_btn"
+       top="6"
+       width="18" />
+      <button
+       follows="bottom|left"
+       height="18"
+       image_selected="AddItem_Press"
+       image_unselected="AddItem_Off"
+       image_disabled="AddItem_Disabled"
        layout="topleft"
        left_pad="5"
-       right="-10"
-       name="newlook_btn"
-        width="100" />-->
-<panel
-        class="panel_look_info"
-        filename="panel_look_info.xml"
-        follows="all"
-        layout="topleft"
-        left="0"
-        name="panel_look_info"
-        visible="false" />
-<panel
-    class="panel_edit_wearable"
-    filename="panel_edit_wearable.xml"
-    follows="all"
-    layout="topleft"
-    left="0"
-    name="panel_edit_wearable"
-    visible="false"
-    width="333" />
-</panel>
+   name="newlook_btn"
+       tool_tip="Add new outfit"
+       width="18" />
+      <dnd_button
+       follows="bottom|left"
+       height="18"
+       image_selected="TrashItem_Press"
+       image_unselected="TrashItem_Off"
+       layout="topleft"
+       right="-5"
+       name="trash_btn"
+       tool_tip="Remove selected item"
+       top="6"
+       width="18" />
+      <button
+       follows="bottom|left"
+      height="23"
+      label="Wear"
+      layout="topleft"
+      name="wear_btn"
+      right="-5"
+      top_pad="0"
+      width="90" />
+   </panel>
+   <!--   <button
+   follows="bottom|left"
+   height="23"
+   label="New outfit"
+   layout="topleft"
+   left_pad="5"
+   right="-10"
+   width="100" />-->
+   <panel
+   class="panel_look_info"
+   filename="panel_look_info.xml"
+   follows="all"
+   layout="topleft"
+   left="0"
+   name="panel_look_info"
+   visible="false" />
+   <panel
+   class="panel_edit_wearable"
+   filename="panel_edit_wearable.xml"
+   follows="all"
+   layout="topleft"
+   left="0"
+   name="panel_edit_wearable"
+   visible="false" />
+</panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 33a6a52f5c00336991ebe5c09211c3a2b734b1ab..b738e7242388cef415e9135ea72d23590390367b 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -41,47 +41,47 @@
 			<button
 				 enabled="true"
 				 follows="bottom|left"
-				 height="25"
-				 label="Info"
+				 height="23"
+				 label="Profile"
 				 layout="topleft"
 				 left="0"
 				 name="info_btn"
 				 top="0"
-				 width="60" />
+				 width="100" />
 			<button
 				 enabled="false"
 				 follows="bottom|left"
-				 height="25"
+				 height="23"
 				 label="Wear"
 				 layout="topleft"
 				 left="130"
 				 name="wear_btn"
 				 top="0"
-				 width="60" />
+				 width="100" />
 			<button
 				 enabled="false"
 				 follows="bottom|left"
-				 height="25"
+				 height="23"
 				 label="Play"
 				 layout="topleft"
 				 name="play_btn"
 				 left="130"
 				 top="0"
-				 width="50" />
+				 width="80" />
 			<button
 				 enabled="false"
 				 follows="bottom|left"
-				 height="25"
+				 height="23"
 				 label="Teleport"
 				 layout="topleft"
 				 left="130"
 				 name="teleport_btn"
 				 top="0"
-				 width="77" />
+				 width="100" />
 		</panel>
 	</panel>
 
-	<panel
+<panel
 		 follows="all"
 		 layout="topleft"
 		 left="0"
@@ -95,7 +95,7 @@
 		 width="330">
 	</panel>
 
-	<panel
+<panel
 		 follows="all"
 		 layout="topleft"
 		 left="0"
@@ -108,5 +108,4 @@
 		 visible="false"
 		 width="330">
 	</panel>
-
 </panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index d006fd0700216bd48e359f9fc01e4ee2b0caa3c9..3cddbed2d493ed1c559ccd5e9fee7843b30bcaff 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -6,7 +6,7 @@
 	 name="item properties"
 	 help_topic="item_properties"
 	 save_rect="true"
-	 title="Inventory Item Properties"
+	 title="Object Profile"
 	 width="333">
 	<panel.string
 		 name="unknown">
@@ -39,27 +39,39 @@
 	     top="4"
 	     width="18" />
     <button
-	     follows="top|right"
-	     height="25"
-	     image_overlay="BackArrow_Off"
-	     layout="topleft"
-	     name="back_btn"
-	     picture_style="true"
-	     right="-5"
-	     tab_stop="false"
-	     top="0"
-	     width="25" />
+     follows="top|right"
+     height="23"
+     image_overlay="BackArrow_Off"
+     layout="topleft"
+     left="10"
+     name="back_btn"
+     tab_stop="false"
+     top="0"
+     width="23" />
+    <text
+     follows="top|left|right"
+     font="SansSerifHuge"
+     height="26"
+     layout="topleft"
+     left_pad="10"
+     name="title"
+     text_color="LtGray"
+     top="0"
+     use_ellipses="true"
+     value="Object Profile"
+     width="275" />
 	<panel
          follows="all"
          height="500"
          label=""
          layout="topleft"
-         left="5"
+         left="10"
          help_topic=""
          top="30"
-		 border="1"
-         width="313">
-	    <text	 	 	 
+         width="313"
+   background_visible="true"
+   bg_alpha_color="DkGray2">
+	    <text
 		     type="string"
 		     length="1"
 		     follows="left|top"
@@ -67,7 +79,7 @@
 		     layout="topleft"
 		     left="5"
 		     name="LabelItemNameTitle"
-		     top="5"
+		     top="10"
 		     width="78">
 	        Name:
 	    </text>
@@ -75,7 +87,7 @@
 		     border_style="line"
 		     border_thickness="1"
 	    	 follows="left|top|right"
-		     height="16"
+		     height="20"
 		     layout="topleft"
 	    	 left_delta="78"
 		     max_length="63"
@@ -90,7 +102,7 @@
 		     layout="topleft"
     		 left="5"
 		     name="LabelItemDescTitle"
-    		 top_delta="20"
+    		 top_pad="10"
 	    	 width="78">
 	        Description:
 	    </text>
@@ -98,88 +110,106 @@
 		     border_style="line"
     		 border_thickness="1"
 	    	 follows="left|top|right"
-	    	 height="16"
+	    	 height="23"
 		     layout="topleft"
     		 left_delta="78"
 		     max_length="127"
     		 name="LabelItemDesc"
-	    	 top_delta="0"
+	    	 top_delta="-5"
 	    	 width="225" />
 	    <text
 		     type="string"
 		     length="1"
 		     follows="left|top"
-		     height="16"
+		     height="23"
 		     layout="topleft"
-		     left="10"
+    		 left="5"
 		     name="LabelCreatorTitle"
-		     top="65"
+top_pad="10"
 		     width="78">
 	        Creator:
     	</text>
+	        <avatar_icon
+     follows="top|left"
+     height="20"
+     default_icon_name="Generic_Person"
+     layout="topleft"
+     left_pad="0"
+		     top_delta="-6"
+     mouse_opaque="true"
+     width="20" />
 	    <text
 		     type="string"
-		     length="1"
-		     follows="left|top"
-		     height="16"
-		     layout="topleft"
-		     left_delta="78"
+     follows="left|right"
+     font="SansSerifSmall"
+     height="15"
+     layout="topleft"
+     left_pad="5"
 		     name="LabelCreatorName"
-		     top_delta="0"
+		     top_delta="6"
 		     width="140">
 	        Nicole Linden
 	     </text>
 	     <button
 			 follows="top|right"
-			 height="16"
-			 label="Profile..."
+			 height="23"
+			 label="Profile"
 			 layout="topleft"
-			 left_delta="144"
+			 right="-1"
 			 name="BtnCreator"
-			 top_delta="0"
+			 top_delta="-6"
 			 width="78" />
 	     <text
 			 type="string"
 			 length="1"
 			 follows="left|top"
-			 height="16"
+			 height="23"
 			 layout="topleft"
-			 left="10"
+    		 left="5"
 			 name="LabelOwnerTitle"
-			 top="85"
+top_pad="5"
 			 width="78">
 			    Owner:
 	     </text>
+	     <avatar_icon
+     follows="top|left"
+     height="20"
+     default_icon_name="Generic_Person"
+     layout="topleft"
+     left_pad="0"
+		     top_delta="-6"
+     mouse_opaque="true"
+     width="20" />
 	     <text
 			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="16"
-			 layout="topleft"
-			 left_delta="78"
+     follows="left|right"
+     font="SansSerifSmall"
+     height="15"
+     layout="topleft"
+     left_pad="5"
 			 name="LabelOwnerName"
-			 top_delta="0"
+			 top_delta="6"
 			 width="140">
 			    Thrax Linden
 	     </text>
 	     <button
 			 follows="top|right"
-			 height="16"
-			 label="Profile..."
+			 height="23"
+			 label="Profile"
 			 layout="topleft"
-			 left_delta="144"
+			 right="-1"
 			 name="BtnOwner"
-			 top_delta="0"
+			 top_delta="-3"
 			 width="78" />
 	     <text
 			 type="string"
 			 length="1"
 			 follows="left|top"
-			 height="16"
+			 height="23"
 			 layout="topleft"
-			 left="10"
+    		 left="5"
 			 name="LabelAcquiredTitle"
-			 top="105"
+top_pad="10"
 			 width="78">
 			Acquired:
 	     </text>
@@ -187,7 +217,7 @@
 			 type="string"
 			 length="1"
 			 follows="left|top"
-			 height="16"
+			 height="23"
 			 layout="topleft"
 			 left_delta="78"
 			 name="LabelAcquiredDate"
@@ -195,134 +225,146 @@
 			 width="222">
 			Wed May 24 12:50:46 2006
 	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left="10"
-			 name="OwnerLabel"
-			 top="125"
-			 width="78">
-			You:
-	    </text>
+	 <panel
+         border="false"
+         follows="left|top"
+         layout="topleft"
+         mouse_opaque="false"
+         background_visible="true"
+         bg_alpha_color="DkGray"
+         name="perms_inv"
+         left="0"
+         top_pad="25"
+         height="155"
+         width="313">
+	  <text
+             type="string"
+             length="1"
+             left="10"
+             top_pad="13"
+             text_color="EmphasisColor"
+	     height="15"
+             follows="left|top|right"
+             layout="topleft"
+             name="perm_modify"
+             width="200">
+                You can:
+            </text>
 	    <check_box
-			 height="16"
-			 label="Edit"
+			 height="18"
+			 label="Modify"
 			 layout="topleft"
-			 left_pad="5"
+			 left="20"
 			 name="CheckOwnerModify"
-			 top_delta="0"
-			 width="78" />
+			 top_pad="0"
+			 width="90" />
 	    <check_box
-			 height="16"
+			 height="18"
 			 label="Copy"
 			 layout="topleft"
-			 left_delta="0"
+			 left_pad="0"
 			 name="CheckOwnerCopy"
-			 top_pad="5"
-			 width="88" />
+			 width="90" />
 	    <check_box
-			 height="16"
-			 label="Resell"
+			 height="18"
+			 label="Transfer"
 			 layout="topleft"
-			 left_delta="0"
+			 left_pad="0"
 			 name="CheckOwnerTransfer"
-			 top_pad="5"
 			 width="106" />
 	    <text
 			 type="string"
 			 length="1"
 			 follows="left|top"
-			 height="10"
+			 height="16"
 			 layout="topleft"
 			 left="10"
 			 name="AnyoneLabel"
-			 top_pad="5"
-			 width="78">
+			 top_pad="8"
+			 width="100">
 			Anyone:
 	    </text>
 	    <check_box
-			 height="16"
+			 height="18"
 			 label="Copy"
 			 layout="topleft"
-			 left_pad="5"
+			 left_pad="0"
 			 name="CheckEveryoneCopy"
-			 top_delta="0"
-			 width="130" />
+			 top_delta="-2"
+			 width="150" />
     	<text
 			 type="string"
 			 length="1"
 			 follows="left|top"
-			 height="10"
+			 height="16"
 			 layout="topleft"
 			 left="10"
 			 name="GroupLabel"
-			 top_pad="5"
-			 width="78">
+			 top_pad="8"
+			 width="100">
 			Group:
     	</text>
 	    <check_box
-			 height="16"
+			 height="18"
 			 label="Share"
 			 layout="topleft"
-			 left_pad="5"
+			 left_pad="0"
+			 top_delta="-2"
 			 name="CheckShareWithGroup"
-			 top_delta="5"
-			 width="106" />
+			 tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+			 width="150" />
 	    <text
 			 type="string"
 			 length="1"
 			 follows="left|top"
-			 height="25"
+			 height="16"
 			 layout="topleft"
 			 left="10"
 			 name="NextOwnerLabel"
-			 top_pad="5"
-			 width="78"
+			 top_pad="8"
+			 width="200"
 			 word_wrap="true">
 			Next owner:
 	    </text>
 	    <check_box
-			 height="16"
-			 label="Edit"
+			 height="18"
+			 label="Modify"
 			 layout="topleft"
-			 left_pad="5"
+			 left="20"
+			 top_pad="0"
 			 name="CheckNextOwnerModify"
-			 top_delta="0"
-			 width="78" />
+			 width="90" />
 	    <check_box
-			 height="16"
+			 height="18"
 			 label="Copy"
 			 layout="topleft"
-			 left_delta="0"
+			 left_pad="0"
 			 name="CheckNextOwnerCopy"
-			 top_pad="5"
-			 width="88" />
+			 width="90" />
 	    <check_box
-			 height="16"
-			 label="Resell"
+			 height="18"
+			 label="Transfer"
 			 layout="topleft"
-			 left_delta="0"
+			 left_pad="0"
 			 name="CheckNextOwnerTransfer"
-			 top_pad="5"
+			 tool_tip="Next owner can give away or resell this object"
 			 width="106" />
+	    </panel>
 	    <check_box
-			 height="16"
+			 height="18"
 			 label="For Sale"
 			 layout="topleft"
-			 left="10"
+			 left="20"
 			 name="CheckPurchase"
-			 top_pad="5"
-			 width="78" />
+			 top_pad="20"
+			 width="100" />
 		<combo_box
-			 height="19"
-			 left_pad="5"
+			 height="23"
+			 left_pad="0"
 			 layout="topleft"
 			 follows="left|top"
 			 name="combobox sale copy"
-			 width="110">
+			 width="170">
 			<combo_box.item
 			     label="Copy"
 			     name="Copy"
@@ -338,26 +380,14 @@
 			    increment="1"
 			    control_name="Edit Cost"
 			    name="Edit Cost"
-			    label="Price:"
-			    label_width="100"
-			    left="10"
-			    width="192"
+			    label="Price: L$"
+			    label_width="75"
+			    left="120"
+			    width="170"
 			    min_val="1"
-			    height="19"
+			    height="23"
 			    max_val="999999999"
-			    top_pad="5"/>
-	    <text
-			    type="string"
-			    length="1"
-			    height="15"
-			    follows="left|top"
-			    layout="topleft"
-			    left_delta="82"
-			    name="CurrencySymbol"
-			    top_delta="1"
-			    width="18">
-			L$
-	    </text>
+			    top_pad="10"/>
 	    <!--line_editor
 			 border_style="line"
 			 border_thickness="1"
@@ -480,31 +510,4 @@
 			Price: L$
 	    </text-->
 	</panel>
-    <panel
-		 height="25"
-		 layout="bottomright"
-		 help_topic="button_tab"
-		 name="button_panel"
-		 left="5"
-		 bottom="5"
-		 width="313">
-	    <button
-		     follows="bottom|right"
-		     height="25"
-		     label="Cancel"
-		     layout="topleft"
-		     name="cancel_btn"
-		     right="-1"
-		     top="0"
-		     width="70" />
-	    <button
-		     follows="bottom|right"
-		     height="25"
-		     label="Save"
-		     layout="topleft"
-		     name="save_btn"
-		     left_pad="-135"
-		     top="0"
-		     width="60" />
-	</panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 58aa609bd605d298cfeee6a4256e34013e663d2e..c3650c71c34face96701472c294aed1f070153c0 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2216,7 +2216,7 @@ If this message persists, restart your computer.
 		[APP_NAME] appears to have frozen or crashed on the previous run.
 Would you like to send a crash report?
 	</string>
-	<string name="MBAlert">Alert</string>
+	<string name="MBAlert">Notification</string>
 	<string name="MBNoDirectX">
 		[APP_NAME] is unable to detect DirectX 9.0b or greater.
 [APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes.  While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b.
@@ -2856,6 +2856,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="inventory_item_offered-im">
     Inventory item offered
   </string>
+  <string name="share_alert">
+    Drag items from inventory here
+  </string>
+
 
   <string name="only_user_message">
     You are the only user in this session.
diff --git a/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml b/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml
index eaa68f56900b1347843bea40e4062880ba5dd029..6c559aa18592be949c7fdcd2a10cb2683a19c595 100644
--- a/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml
@@ -3,10 +3,6 @@
   Based on menu_item_call.xml -->
 <teleport_history_menu_item
   back_item_font="SansSerif"
-  current_item_font="SansSerifBold"
+  current_item_font="SansSerif"
   forward_item_font="SansSerif"
-  back_item_image="teleport_history_backward.tga"
-  forward_item_image="teleport_history_forward.tga"
-  image_hpad="1"
-  image_vpad="0"
   />
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index 27cb52a507fecef9d60a4a242f72381936a56547..d183aac208f1f5bdb622a570309f9e561b4f61d7 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -1529,7 +1529,21 @@ void LLMediaPluginTest::addMediaPanel( std::string url )
 #elif LL_WINDOWS
 	std::string launcher_name( "SLPlugin.exe" );
 #endif
-	media_source->init( launcher_name, plugin_name );
+
+	// for this test app, use the cwd as the user data path (ugh).
+#if LL_WINDOWS
+	std::string user_data_path = ".\\";
+#else
+        char cwd[ FILENAME_MAX ];
+	if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
+	{
+		std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl;
+		return;
+	}
+	std::string user_data_path = std::string( cwd ) + "/";
+#endif
+
+	media_source->init( launcher_name, plugin_name, false, user_data_path );
 	media_source->setDisableTimeout(mDisableTimeout);
 
 	// make a new panel and save parameters
@@ -1752,7 +1766,21 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url )
 #elif LL_WINDOWS
 	std::string launcher_name( "SLPlugin.exe" );
 #endif
-	media_source->init( launcher_name, plugin_name );
+
+	// for this test app, use the cwd as the user data path (ugh).
+#if LL_WINDOWS
+	std::string user_data_path = ".\\";
+#else
+        char cwd[ FILENAME_MAX ];
+	if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
+	{
+		std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl;
+		return;
+	}
+	std::string user_data_path = std::string( cwd ) + "/";
+#endif
+
+	media_source->init( launcher_name, plugin_name, false, user_data_path );
 	media_source->setDisableTimeout(mDisableTimeout);
 
 	// make a new panel and save parameters