diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000000000000000000000000000000000000..0b19cae8387531906559f67da7a7de4acf277786
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,119 @@
+---
+Language:        Cpp
+# BasedOnStyle:  Microsoft
+AccessModifierOffset: -2
+AlignAfterOpenBracket: Align
+AlignConsecutiveMacros: false
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlines: Right
+AlignOperands:   true
+AlignTrailingComments: true
+AllowAllArgumentsOnNextLine: true
+AllowAllConstructorInitializersOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: Always
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: All
+AllowShortLambdasOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: Never
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: MultiLine
+BinPackArguments: true
+BinPackParameters: true
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Allman
+BreakBeforeInheritanceComma: false
+BreakInheritanceList: BeforeColon
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+BreakConstructorInitializers: BeforeColon
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: true
+ColumnLimit:     120
+CommentPragmas:  '^ IWYU pragma:'
+CompactNamespaces: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DeriveLineEnding: true
+DerivePointerAlignment: false
+DisableFormat:   false
+ExperimentalAutoDetectBinPacking: false
+FixNamespaceComments: true
+ForEachMacros:
+  - foreach
+  - Q_FOREACH
+  - BOOST_FOREACH
+IncludeBlocks:   Preserve
+IncludeCategories:
+  - Regex:           '^"(llvm|llvm-c|clang|clang-c)/'
+    Priority:        2
+    SortPriority:    0
+  - Regex:           '^(<|"(gtest|gmock|isl|json)/)'
+    Priority:        3
+    SortPriority:    0
+  - Regex:           '.*'
+    Priority:        1
+    SortPriority:    0
+IncludeIsMainRegex: '(Test)?$'
+IncludeIsMainSourceRegex: ''
+IndentCaseLabels: false
+IndentGotoLabels: true
+IndentPPDirectives: None
+IndentWidth:     4
+IndentWrappedFunctionNames: false
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: ''
+MacroBlockEnd:   ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBinPackProtocolList: Auto
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 2
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyBreakTemplateDeclaration: 10
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 1000
+PointerAlignment: Right
+ReflowComments:  true
+SortIncludes:    false
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: true
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: ControlStatements
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyBlock: false
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles:  false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+SpaceBeforeSquareBrackets: false
+Standard:        Latest
+StatementMacros:
+  - Q_UNUSED
+  - QT_REQUIRE_VERSION
+TabWidth:        4
+UseCRLF:         false
+UseTab:          Never
+...
+
diff --git a/.gitignore b/.gitignore
index 8bc8c43adb2fc6c135b5c1f02b8c042dc561b760..27b629a578c0f410ffd187c2babda05f5c9eaa56 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,43 +1,56 @@
-# WinMerge temp files
+# By extension
+*.DS_Store
 *.bak
-# Compiled python bytecode
+*.diff
+*.orig
 *.pyc
-# Emacs temp files
+*.rej
+*.swp
 *~
-.*.swp
-#OSX image cache file
-*.DS_Store
-#*.orig
+
+# Specific paths and/or names
 LICENSES
-indra/.distcc
-build-linux-*
 build-darwin-*
-build-vc80/
-build-vc100/
-build-vc120/
-build-vc120-32/
-build-vc120-64/
-indra/build-vc[0-9]*
+build-linux-*
+build-stamp
+build-vc120*
+build-vc150*
+configure-stamp
+debian/files
+debian/secondlife-appearance-utility*
+debian/secondlife-viewer*
+indra/.distcc
 indra/CMakeFiles
+indra/build-vc[0-9]*
 indra/lib/mono/1.0/*.dll
 indra/lib/mono/indra/*.dll
 indra/lib/mono/indra/*.exe
 indra/lib/mono/indra/*.pdb
 indra/lib/python/eventlet/
+indra/lib/python/mulib.*
 indra/llwindow/glh/glh_linear.h
 indra/newview/app_settings/dictionaries
 indra/newview/app_settings/mozilla
 indra/newview/app_settings/mozilla-runtime-*
 indra/newview/app_settings/mozilla_debug
 indra/newview/app_settings/static_*.db2
+indra/newview/avatar_icons_cache.txt
+indra/newview/avatar_lad.log
 indra/newview/browser_profile
 indra/newview/character
+indra/newview/dbghelp.dll
+indra/newview/filters.xml
 indra/newview/fmod.dll
 indra/newview/fmod.log
 indra/newview/mozilla-theme
 indra/newview/mozilla-universal-darwin.tgz
-indra/newview/res/ll_icon.*
+indra/newview/pilot.txt
+indra/newview/pilot.xml
 indra/newview/res-sdl/ll_icon.*
+indra/newview/res/ll_icon.*
+indra/newview/search_history.txt
+indra/newview/teleport_history.txt
+indra/newview/typed_locations.txt
 indra/newview/vivox-runtime
 indra/server-linux-*
 indra/temp
@@ -45,29 +58,15 @@ indra/test/linden_file.dat
 indra/test_apps/llmediatest/dependencies/i686-win32
 indra/test_apps/terrain_mule/*.dll
 indra/viewer-linux-*
+indra/web/dataservice/lib/shared/vault.*
+indra/web/dataservice/locale.*
+indra/web/dataservice/vendor.*
 indra/web/doc/asset-upload/plugins/lsl_compiler/lslc
 indra/web/doc/asset-upload/plugins/verify-notecard
 indra/web/doc/asset-upload/plugins/verify-texture
 installed.xml
 libraries
 tarfile_tmp
-debian/secondlife-viewer*
-debian/secondlife-appearance-utility*
-debian/files
-build-stamp
-configure-stamp
-indra/newview/dbghelp.dll
-*.cpp.orig
-*.cpp.bak
-*.h.bak
-*.h.orig
-indra/newview/typed_locations.txt
-indra/newview/teleport_history.txt
-indra/newview/search_history.txt
-indra/newview/filters.xml
-indra/newview/avatar_icons_cache.txt
-indra/newview/avatar_lad.log
-*.diff
-indra/newview/pilot.txt
-indra/newview/pilot.xml
-*.rej
+web/config.*
+web/locale.*
+web/secondlife.com.*
\ No newline at end of file
diff --git a/autobuild.xml b/autobuild.xml
index 47f5fe9d136492d627a004aadaad5a27b385c1f9..513013700e51516b2f904c612ecac9d52f79731e 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -3427,7 +3427,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
     <key>package_description</key>
     <map>
       <key>canonical_repo</key>
-      <string>https://bitbucket.org/lindenlab/viewer-release</string>
+      <string>https://bitbucket.org/lindenlab/viewer</string>
       <key>copyright</key>
       <string>Copyright (c) 2014, Linden Research, Inc.</string>
       <key>description</key>
diff --git a/build.sh b/build.sh
index 1f9daa78b2029a8ac80db2a1d0c07dd4e0c73882..e35028ad6e12779e84aacfb1935e00512215d239 100755
--- a/build.sh
+++ b/build.sh
@@ -259,6 +259,23 @@ then
     export additional_packages=
 fi
 
+begin_section "select viewer channel"
+# Look for a branch-specific viewer_channel setting
+#    changeset_branch is set in the sling-buildscripts
+viewer_build_branch=$(echo -n "${changeset_branch:-$(repo_branch ${BUILDSCRIPTS_SRC:-$(pwd)})}" | tr -Cs 'A-Za-z0-9_' '_' | sed -E 's/^_+//; s/_+$//')
+if [ -n "$viewer_build_branch" ] 
+then
+    branch_viewer_channel_var="${viewer_build_branch}_viewer_channel"
+    if [ -n "${!branch_viewer_channel_var}" ]
+    then
+        viewer_channel="${!branch_viewer_channel_var}"
+        record_event "Overriding viewer_channel for branch '$changeset_branch' to '$viewer_channel'"
+    else
+        record_event "No branch-specific viewer_channel for branch '$viewer_build_branch'; to set a branch build channel set '$branch_viewer_channel_var'"
+    fi
+fi
+end_section "select viewer channel"
+
 python_cmd "$helpers/codeticket.py" addinput "Viewer Channel" "${viewer_channel}"
 
 initialize_version # provided by buildscripts build.sh; sets version id
diff --git a/indra/llappearance/llwearabletype.cpp b/indra/llappearance/llwearabletype.cpp
index 6b7dc41ffdc10b0db17e1b0b4f3359ecdd8452f6..dc02b5e2257b4e6e7bb27333c506fc8eda8a04ec 100644
--- a/indra/llappearance/llwearabletype.cpp
+++ b/indra/llappearance/llwearabletype.cpp
@@ -56,7 +56,7 @@ struct WearableEntry : public LLDictionaryEntry
 	BOOL mAllowMultiwear;
 };
 
-class LLWearableDictionary : public LLParamSingleton<LLWearableDictionary>,
+class LLWearableDictionary : public LLSingleton<LLWearableDictionary>,
 							 public LLDictionary<LLWearableType::EType, WearableEntry>
 {
 	LLSINGLETON(LLWearableDictionary);
@@ -64,6 +64,12 @@ class LLWearableDictionary : public LLParamSingleton<LLWearableDictionary>,
 
 LLWearableDictionary::LLWearableDictionary()
 {
+    if (!LLWearableType::instanceExists())
+    {
+        // LLWearableType is effectively a wrapper around LLWearableDictionary and is used as storage for LLTranslationBridge
+        // Todo: consider merging LLWearableType and LLWearableDictionary
+        LL_WARNS() << "Initing LLWearableDictionary without LLWearableType" << LL_ENDL;
+    }
 	addEntry(LLWearableType::WT_SHAPE,        new WearableEntry("shape",       "New Shape",			LLAssetType::AT_BODYPART, 	LLInventoryType::ICONNAME_BODYPART_SHAPE, FALSE, FALSE));
 	addEntry(LLWearableType::WT_SKIN,         new WearableEntry("skin",        "New Skin",			LLAssetType::AT_BODYPART, 	LLInventoryType::ICONNAME_BODYPART_SKIN, FALSE, FALSE));
 	addEntry(LLWearableType::WT_HAIR,         new WearableEntry("hair",        "New Hair",			LLAssetType::AT_BODYPART, 	LLInventoryType::ICONNAME_BODYPART_HAIR, FALSE, FALSE));
@@ -92,6 +98,7 @@ LLWearableDictionary::LLWearableDictionary()
 
 LLWearableType::LLWearableType(LLTranslationBridge* trans)
 {
+    // LLTranslationBridge exists, but is not ready at this point in time since strings.xml is not yet loaded
     mTrans = trans;
 }
 
@@ -100,14 +107,6 @@ LLWearableType::~LLWearableType()
     delete mTrans;
 }
 
-void LLWearableType::initSingleton()
-{
-    // To make sure all wrapping functions will crash without initing LLWearableType;
-    LLWearableDictionary::initParamSingleton();
-
-    // Todo: consider merging LLWearableType and LLWearableDictionary
-}
-
 // static
 LLWearableType::EType LLWearableType::typeNameToType(const std::string& type_name)
 {
diff --git a/indra/llappearance/llwearabletype.h b/indra/llappearance/llwearabletype.h
index 80bb9a10b4a28bd04dc0694a7e4e75ef475157a2..5fe969822a9e64027da017d7a965b9dc3daec777 100644
--- a/indra/llappearance/llwearabletype.h
+++ b/indra/llappearance/llwearabletype.h
@@ -47,7 +47,6 @@ class LLWearableType : public LLParamSingleton<LLWearableType>
 	LLSINGLETON(LLWearableType, LLTranslationBridge* trans);
 	~LLWearableType();
 	friend struct WearableEntry;
-	void initSingleton();
 public: 
 	enum EType
 	{
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 78b148381025a9c0c18ac9af79bb8edff91d8ffd..85197d1272713a88e34f0058443a133241bf0705 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -664,12 +664,14 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie
 	return result;
 }
 
-void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)
+void LLPluginClassMedia::scrollEvent(int x, int y, int clicks_x, int clicks_y, MASK modifiers)
 {
 	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "scroll_event");
 
 	message.setValueS32("x", x);
 	message.setValueS32("y", y);
+	message.setValueS32("clicks_x", clicks_x);
+	message.setValueS32("clicks_y", clicks_y);
 	message.setValue("modifiers", translateModifiers(modifiers));
 
 	sendMessage(message);
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 4f52afb31741dd72712014b0c8522b8a277b6f8c..9d11ee0421d92f4b2efdaa28a8f800195be9aaa4 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -118,7 +118,7 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner
 	
 	bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);
 
-	void scrollEvent(int x, int y, MASK modifiers);
+	void scrollEvent(int x, int y, int clicks_x, int clicks_y, MASK modifiers);
 
 	// enable/disable media plugin debugging messages and info spam
 	void enableMediaPluginDebugging( bool enable );
diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp
index 4eb0203245985f455a883bd6945387036cdd7b8b..801b94580615956593154162753680cf1eafec53 100644
--- a/indra/llrender/llrender2dutils.cpp
+++ b/indra/llrender/llrender2dutils.cpp
@@ -1650,7 +1650,7 @@ LLPointer<LLUIImage> LLRender2D::getUIImage(const std::string& name, S32 priorit
 // static
 void LLRender2D::resetProvider()
 {
-    if (LLRender2D::instanceExists)
+    if (LLRender2D::instanceExists())
     {
         LLRender2D::getInstance()->mImageProvider = NULL;
     }
diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
index eee6339caf7b8f1e50b82f68901143e8f9043923..6a51c4240b5864ae3fa5bd9503e054e9402b0e32 100644
--- a/indra/llui/llcheckboxctrl.cpp
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -47,10 +47,18 @@ static LLDefaultChildRegistry::Register<LLCheckBoxCtrl> r("check_box");
 template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
 	const std::string& name, BOOL recurse) const;
 
+void LLCheckBoxCtrl::WordWrap::declareValues()
+{
+    declare("none", EWordWrap::WRAP_NONE);
+    declare("down", EWordWrap::WRAP_DOWN);
+    declare("up", EWordWrap::WRAP_UP);
+}
+
 LLCheckBoxCtrl::Params::Params()
 :	initial_value("initial_value", false),
 	label_text("label_text"),
 	check_button("check_button"),
+	word_wrap("word_wrap", EWordWrap::WRAP_NONE),
 	radio_style("radio_style")
 {}
 
@@ -59,14 +67,14 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
 :	LLUICtrl(p),
 	mTextEnabledColor(p.label_text.text_color()),
 	mTextDisabledColor(p.label_text.text_readonly_color()),
-	mFont(p.font())
+	mFont(p.font()),
+	mWordWrap(p.word_wrap)
 {
 	mViewModel->setValue(LLSD(p.initial_value));
 	mViewModel->resetDirty();
 	static LLUICachedControl<S32> llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0);
 	static LLUICachedControl<S32> llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0);
 	static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0);
-	static LLUICachedControl<S32> llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0);
 
 	// must be big enough to hold all children
 	setUseBoundingRect(TRUE);
@@ -85,20 +93,47 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
 	{
 		tbparams.font(p.font);
 	}
-	mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams);
+
+    mLabel = LLUICtrlFactory::create<LLTextBox>(tbparams);
+    if (mWordWrap != WRAP_NONE)
+    {
+        // Not setWordWrap(mWordWrap != WRAP_NONE) because there might be some old lurking code that sets it manually
+        mLabel->setWordWrap(true);
+        S32 new_width = getRect().getWidth() - p.check_button.rect().getWidth() - llcheckboxctrl_hpad;
+        LLRect label_rect = mLabel->getRect();
+        label_rect.mRight = label_rect.mLeft + new_width;
+        mLabel->setRect(label_rect);
+    }
 	mLabel->reshapeToFitText();
-	addChild(mLabel);
 
 	LLRect label_rect = mLabel->getRect();
+	if (mLabel->getLineCount() > 1)
+	{
+        if (mWordWrap == WRAP_DOWN)
+        {
+            // reshapeToFitText uses LLView::reshape() which always reshapes
+            // from bottom to top, but we want to extend the bottom
+            // Note: might be better idea to use getRect().mTop of LLCheckBoxCtrl (+pad) as top point of new rect
+            S32 delta = ll_round((F32)mLabel->getFont()->getLineHeight() * mLabel->getLineSpacingMult()) - label_rect.getHeight();
+            label_rect.translate(0, delta);
+            mLabel->setRect(label_rect);
+        }
+        // else
+        // WRAP_UP is essentially done by reshapeToFitText() (extends from bottom to top)
+        // howhever it doesn't respect rect of checkbox
+        // todo: this should be fixed, but there are at least couple checkboxes that use this feature as is.
+	}
+
+	addChild(mLabel);
 
 	// Button
-	// Note: button cover the label by extending all the way to the right.
+	// Note: button cover the label by extending all the way to the right and down.
 	LLRect btn_rect = p.check_button.rect();
 	btn_rect.setOriginAndSize(
 		btn_rect.mLeft,
-		btn_rect.mBottom,
+		llmin(btn_rect.mBottom, label_rect.mBottom),
 		llmax(btn_rect.mRight, label_rect.mRight - btn_rect.mLeft),
-		llmax( label_rect.getHeight(), btn_rect.mTop));
+		llmax(label_rect.getHeight(), btn_rect.mTop));
 	std::string active_true_id, active_false_id;
 	std::string inactive_true_id, inactive_false_id;
 
@@ -152,17 +187,26 @@ void LLCheckBoxCtrl::clear()
 
 void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
-
+	S32 label_top = mLabel->getRect().mTop;
 	mLabel->reshapeToFitText();
 
 	LLRect label_rect = mLabel->getRect();
+	if (label_top != label_rect.mTop && mWordWrap == WRAP_DOWN)
+	{
+		// reshapeToFitText uses LLView::reshape() which always reshapes
+		// from bottom to top, but we want to extend the bottom so
+		// reposition control
+		S32 delta = label_top - label_rect.mTop;
+		label_rect.translate(0, delta);
+		mLabel->setRect(label_rect);
+	}
 
 	// Button
-	// Note: button cover the label by extending all the way to the right.
+	// Note: button cover the label by extending all the way to the right and down.
 	LLRect btn_rect = mButton->getRect();
 	btn_rect.setOriginAndSize(
 		btn_rect.mLeft,
-		btn_rect.mBottom,
+		llmin(btn_rect.mBottom, label_rect.mBottom),
 		llmax(btn_rect.getWidth(), label_rect.mRight - btn_rect.mLeft),
 		llmax(label_rect.mTop - btn_rect.mBottom, btn_rect.getHeight()));
 	mButton->setShape(btn_rect);
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 07ae9c3b18670301bd3934193ad183fd8f9c4312..eb5bd5b6da5c26851d33ed6463ce1381f805213b 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -50,6 +50,19 @@ class LLCheckBoxCtrl
 , public ll::ui::SearchableControl
 {
 public:
+
+    enum EWordWrap
+    {
+        WRAP_NONE,
+        WRAP_UP,
+        WRAP_DOWN
+    };
+
+    struct WordWrap : public LLInitParam::TypeValuesHelper<EWordWrap, WordWrap>
+    {
+        static void declareValues();
+    };
+
 	struct Params 
 	:	public LLInitParam::Block<Params, LLUICtrl::Params>
 	{
@@ -58,6 +71,8 @@ class LLCheckBoxCtrl
 		Optional<LLTextBox::Params> label_text;
 		Optional<LLButton::Params> check_button;
 
+		Optional<EWordWrap, WordWrap>	word_wrap;
+
 		Ignored					radio_style;
 
 		Params();
@@ -129,6 +144,8 @@ class LLCheckBoxCtrl
 
 	LLUIColor		mTextEnabledColor;
 	LLUIColor		mTextDisabledColor;
+
+	EWordWrap		mWordWrap; // off, shifts text up, shifts text down
 };
 
 // Build time optimization, generate once in .cpp file
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 200dd2fdca6498230d441daad8aa5f1aa5ce1c6f..732fa9feb1c103b2623142531049a6891e99fc9f 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -788,6 +788,12 @@ void LLMenuItemCallGL::initFromParams(const Params& p)
 			{
 				setEnabledControlVariable(control);
 			}
+			else
+			{
+				LL_WARNS() << "Failed to assign 'enabled' control variable to menu " << getName()
+							<< ": control " << p.on_enable.control_name()
+							<< " does not exist." << LL_ENDL;
+			}
 		}
 	}
 	if (p.on_click.isProvided())
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 9fc6c05ead9d5a70dcf1a52ff6c396432e2c1826..6a7075301bea873a472c71d21fb0538d79ae1d49 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -68,7 +68,8 @@ LLNotificationForm::FormIgnore::FormIgnore()
 	control("control"),
 	invert_control("invert_control", false),
 	save_option("save_option", false),
-	session_only("session_only", false)
+	session_only("session_only", false),
+	checkbox_only("checkbox_only", false)
 {}
 
 LLNotificationForm::FormButton::FormButton()
@@ -195,10 +196,15 @@ LLNotificationForm::LLNotificationForm(const std::string& name, const LLNotifica
 {
 	if (p.ignore.isProvided())
 	{
+		// For all cases but IGNORE_CHECKBOX_ONLY this is name for use in preferences
 		mIgnoreMsg = p.ignore.text;
 
 		LLUI *ui_inst = LLUI::getInstance();
-		if (!p.ignore.save_option)
+		if (p.ignore.checkbox_only)
+		{
+			mIgnore = IGNORE_CHECKBOX_ONLY;
+		}
+		else if (!p.ignore.save_option)
 		{
 			mIgnore = p.ignore.session_only ? IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY : IGNORE_WITH_DEFAULT_RESPONSE;
 		}
@@ -215,7 +221,7 @@ LLNotificationForm::LLNotificationForm(const std::string& name, const LLNotifica
 			mIgnoreSetting = ui_inst->mSettingGroups["config"]->getControl(p.ignore.control);
 			mInvertSetting = p.ignore.invert_control;
 		}
-		else
+		else if (mIgnore > IGNORE_NO)
 		{
 			ui_inst->mSettingGroups["ignores"]->declareBOOL(name, show_notification, "Show notification with this name", LLControlVariable::PERSIST_NONDFT);
 			mIgnoreSetting = ui_inst->mSettingGroups["ignores"]->getControl(name);
@@ -389,13 +395,12 @@ LLControlVariablePtr LLNotificationForm::getIgnoreSetting()
 bool LLNotificationForm::getIgnored()
 {
 	bool show = true;
-	if (mIgnore != LLNotificationForm::IGNORE_NO
+	if (mIgnore > LLNotificationForm::IGNORE_NO
 		&& mIgnoreSetting) 
 	{
 		show = mIgnoreSetting->getValue().asBoolean();
 		if (mInvertSetting) show = !show;
 	}
-
 	return !show;
 }
 
@@ -696,7 +701,7 @@ void LLNotification::respond(const LLSD& response)
 		mTemporaryResponder = false;
 	}
 
-	if (mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO)
+	if (mForm->getIgnoreType() > LLNotificationForm::IGNORE_NO)
 	{
 		mForm->setIgnored(mIgnored);
 		if (mIgnored && mForm->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 15094469208151af209dd380ae03503842edc111..62cf41256bfd3984837f2ab7252114fd3df77158 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -180,6 +180,7 @@ class LLNotificationForm
 		Optional<std::string>	control;
 		Optional<bool>			invert_control;
 		Optional<bool>			session_only;
+		Optional<bool>			checkbox_only;
 
 		FormIgnore();
 	};
@@ -232,7 +233,8 @@ class LLNotificationForm
 
 	typedef enum e_ignore_type
 	{ 
-		IGNORE_NO,
+		IGNORE_CHECKBOX_ONLY = -1, // ignore won't be handled, will set value/checkbox only
+		IGNORE_NO = 0,
 		IGNORE_WITH_DEFAULT_RESPONSE,
 		IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY,
 		IGNORE_WITH_LAST_RESPONSE, 
diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp
index b3a79bc1ebf4475549c522d1c26a92aaed4f2a2d..fde6de49219bc6acc031d1293bf462ac054651fd 100644
--- a/indra/llui/llscrollbar.cpp
+++ b/indra/llui/llscrollbar.cpp
@@ -408,6 +408,16 @@ BOOL LLScrollbar::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	return handled;
 }
 
+BOOL LLScrollbar::handleScrollHWheel(S32 x, S32 y, S32 clicks)
+{
+	BOOL handled = FALSE;
+	if (LLScrollbar::HORIZONTAL == mOrientation)
+	{
+		handled = changeLine(clicks * mStepSize, TRUE);
+	}
+	return handled;
+}
+
 BOOL LLScrollbar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 									EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string &tooltip_msg)
 {
diff --git a/indra/llui/llscrollbar.h b/indra/llui/llscrollbar.h
index e2bf52c14bce6463fef574a699f73b324a2a81e2..5f2f490d811884d2b3d6fe14bd5151dd5312d0d9 100644
--- a/indra/llui/llscrollbar.h
+++ b/indra/llui/llscrollbar.h
@@ -88,6 +88,7 @@ class LLScrollbar
 	virtual BOOL	handleDoubleClick(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);
+	virtual BOOL	handleScrollHWheel(S32 x, S32 y, S32 clicks);
 	virtual BOOL	handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, 
 		EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string &tooltip_msg);
 
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index 6135cc56ad76197ed382d254134293613f25ac60..3db38bbfacf56e2bb6bee810757771fd7041427f 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -272,6 +272,25 @@ BOOL LLScrollContainer::handleScrollWheel( S32 x, S32 y, S32 clicks )
 	return FALSE;
 }
 
+BOOL LLScrollContainer::handleScrollHWheel(S32 x, S32 y, S32 clicks)
+{
+	if (LLUICtrl::handleScrollHWheel(x,y,clicks))
+	{
+		return TRUE;
+	}
+
+	LLScrollbar* horizontal = mScrollbar[HORIZONTAL];
+	if (horizontal->getVisible()
+		&& horizontal->getEnabled()
+		&& horizontal->handleScrollHWheel( 0, 0, clicks ) )
+	{
+		updateScroll();
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
 BOOL LLScrollContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,
 												  BOOL drop,
 												  EDragAndDropType cargo_type,
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index e6c78913975c706a80e40e4fe22dec603c1ef354..c14099dbd5361f409905827eb5269396f72d37e2 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -107,6 +107,7 @@ class LLScrollContainer : public LLUICtrl
 	virtual BOOL	handleKeyHere(KEY key, MASK mask);
 	virtual BOOL	handleUnicodeCharHere(llwchar uni_char);
 	virtual BOOL	handleScrollWheel( S32 x, S32 y, S32 clicks );
+	virtual BOOL	handleScrollHWheel( S32 x, S32 y, S32 clicks );
 	virtual BOOL	handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 								   EDragAndDropType cargo_type,
 								   void* cargo_data,
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index f4028057e8565b66078f4b9abc706c30910923e4..6c8fde580f6ec0576052da91906b5b22c000ef04 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -1601,6 +1601,20 @@ BOOL LLScrollListCtrl::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	return handled;
 }
 
+BOOL LLScrollListCtrl::handleScrollHWheel(S32 x, S32 y, S32 clicks)
+{
+	BOOL handled = FALSE;
+	// Pretend the mouse is over the scrollbar
+	handled = mScrollbar->handleScrollHWheel( 0, 0, clicks );
+
+	if (mMouseWheelOpaque)
+	{
+		return TRUE;
+	}
+
+	return handled;
+}
+
 // *NOTE: Requires a valid row_index and column_index
 LLRect LLScrollListCtrl::getCellRect(S32 row_index, S32 column_index)
 {
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index b35a8608e70d82e2b9ec8f9ab7fb0d764ad329b2..d7572d9fcf6290f9ce652dc194f184a925a32232 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -317,6 +317,7 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 	/*virtual*/ BOOL	handleKeyHere(KEY key, MASK mask);
 	/*virtual*/ BOOL	handleUnicodeCharHere(llwchar uni_char);
 	/*virtual*/ BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);
+	/*virtual*/ BOOL	handleScrollHWheel(S32 x, S32 y, S32 clicks);
 	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, MASK mask);
 	/*virtual*/ void	setEnabled(BOOL enabled);
 	/*virtual*/ void	setFocus( BOOL b );
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 22635f734e6fa213dd09751a672e7b802161a1ec..e64078828b813e8a6fa0ddc3f9ecc65a2da1b9f3 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -3113,6 +3113,7 @@ BOOL LLTextSegment::handleRightMouseUp(S32 x, S32 y, MASK mask) { return FALSE;
 BOOL LLTextSegment::handleDoubleClick(S32 x, S32 y, MASK mask) { return FALSE; }
 BOOL LLTextSegment::handleHover(S32 x, S32 y, MASK mask) { return FALSE; }
 BOOL LLTextSegment::handleScrollWheel(S32 x, S32 y, S32 clicks) { return FALSE; }
+BOOL LLTextSegment::handleScrollHWheel(S32 x, S32 y, S32 clicks) { return FALSE; }
 BOOL LLTextSegment::handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; }
 const std::string&	LLTextSegment::getName() const 
 {
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 9831c35858f5253d81f8f8a2f5695a575d868cbf..058b804714bc2fdc752e3bef32d1adc81f93f4d8 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -103,6 +103,7 @@ class LLTextSegment
 	/*virtual*/ BOOL			handleDoubleClick(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL			handleHover(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL			handleScrollWheel(S32 x, S32 y, S32 clicks);
+	/*virtual*/ BOOL			handleScrollHWheel(S32 x, S32 y, S32 clicks);
 	/*virtual*/ BOOL			handleToolTip(S32 x, S32 y, MASK mask);
 	/*virtual*/ const std::string&	getName() const;
 	/*virtual*/ void			onMouseCaptureLost();
@@ -440,6 +441,8 @@ class LLTextBase
 
 	S32						getVPad() { return mVPad; }
 	S32						getHPad() { return mHPad; }
+	F32						getLineSpacingMult() { return mLineSpacingMult; }
+	S32						getLineSpacingPixels() { return mLineSpacingPixels; } // only for multiline
 
 	S32						getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line = true) const;
 	LLRect					getLocalRectFromDocIndex(S32 pos) const;
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index df74e113e9bc954f56f526e29427cc2c34da3547..c98da0d41043dec1367871be9313a24f4b4030e8 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -137,13 +137,29 @@ void LLUICtrl::initFromParams(const Params& p)
 		{
 			LLControlVariable* control = findControl(p.enabled_controls.enabled);
 			if (control)
+			{
 				setEnabledControlVariable(control);
+			}
+			else
+			{
+				LL_WARNS() << "Failed to assign 'enabled' control variable to " << getName()
+							<< ": control " << p.enabled_controls.enabled()
+							<< " does not exist." << LL_ENDL;
+			}
 		}
 		else if(p.enabled_controls.disabled.isChosen())
 		{
 			LLControlVariable* control = findControl(p.enabled_controls.disabled);
 			if (control)
+			{
 				setDisabledControlVariable(control);
+			}
+			else
+			{
+				LL_WARNS() << "Failed to assign 'disabled' control variable to " << getName() 
+							<< ": control " << p.enabled_controls.disabled()
+							<< " does not exist." << LL_ENDL;
+			}
 		}
 	}
 	if(p.controls_visibility.isProvided())
@@ -152,13 +168,29 @@ void LLUICtrl::initFromParams(const Params& p)
 		{
 			LLControlVariable* control = findControl(p.controls_visibility.visible);
 			if (control)
+			{
 				setMakeVisibleControlVariable(control);
+			}
+			else
+			{
+				LL_WARNS() << "Failed to assign visibility control variable to " << getName()
+							<< ": control " << p.controls_visibility.visible()
+							<< " does not exist." << LL_ENDL;
+			}
 		}
 		else if (p.controls_visibility.invisible.isChosen())
 		{
 			LLControlVariable* control = findControl(p.controls_visibility.invisible);
 			if (control)
+			{
 				setMakeInvisibleControlVariable(control);
+			}
+			else
+			{
+				LL_WARNS() << "Failed to assign invisibility control variable to " << getName()
+							<< ": control " << p.controls_visibility.invisible()
+							<< " does not exist." << LL_ENDL;
+			}
 		}
 	}
 
@@ -497,6 +529,11 @@ void LLUICtrl::setControlName(const std::string& control_name, LLView *context)
 	if (!control_name.empty())
 	{
 		LLControlVariable* control = context->findControl(control_name);
+		if (!control)
+		{
+			LL_WARNS() << "Failed to assign control variable to " << getName()
+						<< ": control "<< control_name << " does not exist." << LL_ENDL;
+		}
 		setControlVariable(control);
 	}
 }
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 55cd45dbf26f3783e7765a6d8ca25dcb96c88add..593c8b12fc8a7c328de2e52eabba3a4ed8340c6b 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -1060,6 +1060,11 @@ BOOL LLView::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	return childrenHandleScrollWheel( x, y, clicks ) != NULL;
 }
 
+BOOL LLView::handleScrollHWheel(S32 x, S32 y, S32 clicks)
+{
+	return childrenHandleScrollHWheel( x, y, clicks ) != NULL;
+}
+
 BOOL LLView::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
 	return childrenHandleRightMouseDown( x, y, mask ) != NULL;
@@ -1085,6 +1090,11 @@ LLView* LLView::childrenHandleScrollWheel(S32 x, S32 y, S32 clicks)
 	return childrenHandleMouseEvent(&LLView::handleScrollWheel, x, y, clicks, false);
 }
 
+LLView* LLView::childrenHandleScrollHWheel(S32 x, S32 y, S32 clicks)
+{
+	return childrenHandleMouseEvent(&LLView::handleScrollHWheel, x, y, clicks, false);
+}
+
 // Called during downward traversal
 LLView* LLView::childrenHandleKey(KEY key, MASK mask)
 {
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index e36ca7c8c691a4abb83d92677bc678d8e7012de7..db81900aaff267e0d149d76ab712159bd3edc704 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -426,6 +426,7 @@ class LLView
 	/*virtual*/ BOOL	handleMiddleMouseDown(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL	handleDoubleClick(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);
+	/*virtual*/ BOOL	handleScrollHWheel(S32 x, S32 y, S32 clicks);
 	/*virtual*/ BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL	handleRightMouseUp(S32 x, S32 y, MASK mask);	
 	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, MASK mask);
@@ -556,6 +557,7 @@ class LLView
 	LLView* childrenHandleMiddleMouseDown(S32 x, S32 y, MASK mask);
 	LLView* childrenHandleDoubleClick(S32 x, S32 y, MASK mask);
 	LLView*	childrenHandleScrollWheel(S32 x, S32 y, S32 clicks);
+	LLView*	childrenHandleScrollHWheel(S32 x, S32 y, S32 clicks);
 	LLView* childrenHandleRightMouseDown(S32 x, S32 y, MASK mask);
 	LLView* childrenHandleRightMouseUp(S32 x, S32 y, MASK mask);
 	LLView* childrenHandleToolTip(S32 x, S32 y, MASK mask);
diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp
index d4790f9f294bca55a2112b6dd50511acf6fcca4c..9397b831f724f62b7a988a8890af648476ea1e53 100644
--- a/indra/llwindow/lldxhardware.cpp
+++ b/indra/llwindow/lldxhardware.cpp
@@ -613,6 +613,7 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
 	IDxDiagContainer *device_containerp = NULL;
 	IDxDiagContainer *file_containerp = NULL;
 	IDxDiagContainer *driver_containerp = NULL;
+	DWORD dw_device_count;
 
     // CoCreate a IDxDiagProvider*
 	LL_DEBUGS("AppInit") << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL;
@@ -663,9 +664,18 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
 		hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp);
 		if(FAILED(hr) || !devices_containerp)
 		{
+            // do not release 'dirty' devices_containerp at this stage, only dx_diag_rootp
+            devices_containerp = NULL; 
             goto LCleanup;
 		}
 
+        // make sure there is something inside
+        hr = devices_containerp->GetNumberOfChildContainers(&dw_device_count);
+        if (FAILED(hr) || dw_device_count == 0)
+        {
+            goto LCleanup;
+        }
+
 		// Get device 0
 		LL_DEBUGS("AppInit") << "devices_containerp->GetChildContainer" << LL_ENDL;
 		hr = devices_containerp->GetChildContainer(L"0", &device_containerp);
@@ -872,6 +882,7 @@ LLSD LLDXHardware::getDisplayInfo()
 	IDxDiagContainer *device_containerp = NULL;
 	IDxDiagContainer *file_containerp = NULL;
 	IDxDiagContainer *driver_containerp = NULL;
+	DWORD dw_device_count;
 
     // CoCreate a IDxDiagProvider*
 	LL_INFOS() << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL;
@@ -922,9 +933,18 @@ LLSD LLDXHardware::getDisplayInfo()
 		hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp);
 		if(FAILED(hr) || !devices_containerp)
 		{
+            // do not release 'dirty' devices_containerp at this stage, only dx_diag_rootp
+            devices_containerp = NULL;
             goto LCleanup;
 		}
 
+        // make sure there is something inside
+        hr = devices_containerp->GetNumberOfChildContainers(&dw_device_count);
+        if (FAILED(hr) || dw_device_count == 0)
+        {
+            goto LCleanup;
+        }
+
 		// Get device 0
 		LL_INFOS() << "devices_containerp->GetChildContainer" << LL_ENDL;
 		hr = devices_containerp->GetChildContainer(L"0", &device_containerp);
@@ -976,6 +996,10 @@ LLSD LLDXHardware::getDisplayInfo()
     }
 
 LCleanup:
+    if (ret.emptyMap())
+    {
+        LL_INFOS() << "Failed to get data, cleaning up" << LL_ENDL;
+    }
 	SAFE_RELEASE(file_containerp);
 	SAFE_RELEASE(driver_containerp);
 	SAFE_RELEASE(device_containerp);
diff --git a/indra/llwindow/llmousehandler.h b/indra/llwindow/llmousehandler.h
index 8e6fbdb4e3d51248f67b80979d1e175096fbca3c..1dcd0348d8bcd65414916024d3d2305fc8aeda18 100644
--- a/indra/llwindow/llmousehandler.h
+++ b/indra/llwindow/llmousehandler.h
@@ -66,6 +66,7 @@ class LLMouseHandler
 
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask) = 0;
 	virtual BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks) = 0;
+	virtual BOOL	handleScrollHWheel(S32 x, S32 y, S32 clicks) = 0;
 	virtual BOOL	handleToolTip(S32 x, S32 y, MASK mask) = 0;
 	virtual const std::string& getName() const = 0;
 
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 1b0b9213a5fc110709d9f798cda8ccd4ccf03317..5b9dce02c4bae01ff49dd2f0e13034d51f31264e 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -467,7 +467,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
 
 - (void) scrollWheel:(NSEvent *)theEvent
 {
-	callScrollMoved(-[theEvent deltaY]);
+	callScrollMoved(-[theEvent deltaX], -[theEvent deltaY]);
 }
 
 - (void) mouseExited:(NSEvent *)theEvent
diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp
index c01f57437582d3cc6653cb6d0d01486e2c9e96f2..be61e1e16c62fd4db5b04e67bb92a612fe170f3b 100644
--- a/indra/llwindow/llwindowcallbacks.cpp
+++ b/indra/llwindow/llwindowcallbacks.cpp
@@ -130,6 +130,10 @@ void LLWindowCallbacks::handleScrollWheel(LLWindow *window, S32 clicks)
 {
 }
 
+void LLWindowCallbacks::handleScrollHWheel(LLWindow *window, S32 clicks)
+{
+}
+
 void LLWindowCallbacks::handleResize(LLWindow *window, const S32 width, const S32 height)
 {
 }
diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h
index 9304446f8f1d1da1d2d7038c6ce2d4c7ae292f96..3b186481388cc8d290a5a5a2788665b77a7a5807 100644
--- a/indra/llwindow/llwindowcallbacks.h
+++ b/indra/llwindow/llwindowcallbacks.h
@@ -56,6 +56,7 @@ class LLWindowCallbacks
 	virtual void handleMouseMove(LLWindow *window,  LLCoordGL pos, MASK mask);
     virtual void handleMouseDragged(LLWindow *window,  LLCoordGL pos, MASK mask);
 	virtual void handleScrollWheel(LLWindow *window,  S32 clicks);
+	virtual void handleScrollHWheel(LLWindow *window,  S32 clicks);
 	virtual void handleResize(LLWindow *window,  S32 width,  S32 height);
 	virtual void handleFocus(LLWindow *window);
 	virtual void handleFocusLost(LLWindow *window);
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index 0f77ebe7a47490a3e3760d39b71931b7401b78cc..44fd4127ce5a06b0e1694828b1eb9fe0b00c7f92 100644
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -142,7 +142,7 @@ void callDoubleClick(float *pos, unsigned int mask);
 void callResize(unsigned int width, unsigned int height);
 void callMouseMoved(float *pos, unsigned int mask);
 void callMouseDragged(float *pos, unsigned int mask);
-void callScrollMoved(float delta);
+void callScrollMoved(float deltaX, float deltaY);
 void callMouseExit();
 void callWindowFocus();
 void callWindowUnfocus();
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index d9b95d311aee58c378ced3d6c82f44d3bef5af42..2604a23c85107a5aaffa11373938ec4c547e4275 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -356,9 +356,13 @@ void callMouseDragged(float *pos, MASK mask)
     gWindowImplementation->getCallbacks()->handleMouseDragged(gWindowImplementation, outCoords, gKeyboard->currentMask(TRUE));
 }
 
-void callScrollMoved(float delta)
+void callScrollMoved(float deltaX, float deltaY)
 {
-	gWindowImplementation->getCallbacks()->handleScrollWheel(gWindowImplementation, delta);
+	if ( gWindowImplementation && gWindowImplementation->getCallbacks() )
+	{
+		gWindowImplementation->getCallbacks()->handleScrollHWheel(gWindowImplementation, deltaX);
+		gWindowImplementation->getCallbacks()->handleScrollWheel(gWindowImplementation, deltaY);
+	}
 }
 
 void callMouseExit()
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 8fefb119bce3d6edf7588fc418531744dd93c9ff..3c69aa98c43439b1435a0b539e63e89ec5981e5a 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -2662,6 +2662,42 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
 			return 0;
 			}
 			*/
+		case WM_MOUSEHWHEEL:
+			{
+				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_MOUSEHWHEEL");
+				static short h_delta = 0;
+
+				RECT	client_rect;
+
+				// eat scroll events that occur outside our window, since we use mouse position to direct scroll
+				// instead of keyboard focus
+				// NOTE: mouse_coord is in *window* coordinates for scroll events
+				POINT mouse_coord = {(S32)(S16)LOWORD(l_param), (S32)(S16)HIWORD(l_param)};
+
+				if (ScreenToClient(window_imp->mWindowHandle, &mouse_coord)
+					&& GetClientRect(window_imp->mWindowHandle, &client_rect))
+				{
+					// we have a valid mouse point and client rect
+					if (mouse_coord.x < client_rect.left || client_rect.right < mouse_coord.x
+						|| mouse_coord.y < client_rect.top || client_rect.bottom < mouse_coord.y)
+					{
+						// mouse is outside of client rect, so don't do anything
+						return 0;
+					}
+				}
+
+				S16 incoming_h_delta = HIWORD(w_param);
+				h_delta += incoming_h_delta;
+
+				// If the user rapidly spins the wheel, we can get messages with
+				// large deltas, like 480 or so.  Thus we need to scroll more quickly.
+				if (h_delta <= -WHEEL_DELTA || WHEEL_DELTA <= h_delta)
+				{
+					window_imp->mCallbacks->handleScrollHWheel(window_imp, h_delta / WHEEL_DELTA);
+					h_delta = 0;
+				}
+				return 0;
+			}
 			// Handle mouse movement within the window
 		case WM_MOUSEMOVE:
 			{
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index d5a685e47f1562555554af8c39ff98e958a5e25c..cff21b13c476d4ae6e625e18e1e3d5ce8bb920ce 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -660,12 +660,18 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
 			}
 			else if (message_name == "scroll_event")
 			{
-				S32 x = message_in.getValueS32("x");
-				S32 y = message_in.getValueS32("y");
+				// Mouse coordinates for cef to be able to scroll 'containers'
+				//S32 x = message_in.getValueS32("x");
+				//S32 y = message_in.getValueS32("y");
+				// Wheel's clicks
+				S32 delta_x = message_in.getValueS32("clicks_x");
+				S32 delta_y = message_in.getValueS32("clicks_y");
 				const int scaling_factor = 40;
-				y *= -scaling_factor;
+				delta_x *= -scaling_factor;
+				delta_y *= -scaling_factor;
 
-				mCEFLib->mouseWheel(x, y);
+				// mCEFLib->mouseWheel(x, y, delta_x, delta_y);
+				mCEFLib->mouseWheel(delta_x, delta_y);
 			}
 			else if (message_name == "text_event")
 			{
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 8d0a9bf61220c8189f10d4f7f7e86598aea59b24..b4a5666f80fcec9314a1530c4740092183573a8a 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -244,6 +244,7 @@ set(viewer_SOURCE_FILES
     llfloaterexperienceprofile.cpp
     llfloaterexperiences.cpp
     llfloaterfonttest.cpp
+    llfloaterforgetuser.cpp
     llfloatergesture.cpp
     llfloatergodtools.cpp
     llfloatergotoline.cpp
@@ -659,6 +660,7 @@ set(viewer_SOURCE_FILES
     llviewerobject.cpp
     llviewerobjectlist.cpp
     llvieweroctree.cpp
+    llviewerparcelaskplay.cpp
     llviewerparcelmedia.cpp
     llviewerparcelmediaautoplay.cpp
     llviewerparcelmgr.cpp
@@ -865,6 +867,7 @@ set(viewer_HEADER_FILES
     llfloaterexperienceprofile.h
     llfloaterexperiences.h
     llfloaterfonttest.h
+    llfloaterforgetuser.h
     llfloatergesture.h
     llfloatergodtools.h
     llfloatergotoline.h
@@ -1274,6 +1277,7 @@ set(viewer_HEADER_FILES
     llviewerobject.h
     llviewerobjectlist.h
     llvieweroctree.h
+    llviewerparcelaskplay.h
     llviewerparcelmedia.h
     llviewerparcelmediaautoplay.h
     llviewerparcelmgr.h
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index b98d1d3fa746f67079f0a6fc24649c7aff21ddea..c8320dd5212901adbcff96267af22d63c51aa545 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.3.5
+6.3.6
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index fa37dea51b33b4c5a16bd73a5038c3765ed17844..98143bbce61353b4275cec36ad8a5121e5af5c30 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -150,16 +150,6 @@
            is_running_function="Floater.IsOpen"
            is_running_parameters="moveview"
            />
-  <command name="outbox"
-           available_in_toybox="false"
-           icon="Command_Outbox_Icon"
-           label_ref="Command_Outbox_Label"
-           tooltip_ref="Command_Outbox_Tooltip"
-           execute_function="Floater.ToggleOrBringToFront"
-           execute_parameters="outbox"
-           is_running_function="Floater.IsOpen"
-           is_running_parameters="outbox"
-           />
   <command name="people"
            available_in_toybox="true"
            icon="Command_People_Icon"
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index f73f925635c4cfc0050ce153558b8d5dbc6f0047..da1e87fda47b5e2c69df73332707e1fb34a1d16d 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4913,7 +4913,7 @@
     <key>InventoryOutboxDisplayBoth</key>
     <map>
         <key>Comment</key>
-        <string>Show the legacy Merchant Outbox UI as well as the Marketplace Listings UI</string>
+        <string>(Deprecated) Show the legacy Merchant Outbox UI as well as the Marketplace Listings UI</string>
         <key>Persist</key>
         <integer>1</integer>
         <key>Type</key>
@@ -7494,11 +7494,11 @@
     <key>ParcelMediaAutoPlayEnable</key>
     <map>
       <key>Comment</key>
-      <string>Auto play parcel media when available</string>
+      <string>Auto play parcel media when available. 0 - Do not autoplay; 1- Autoplay; 2 - Ask</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
-      <string>Boolean</string>
+      <string>S32</string>
       <key>Value</key>
       <integer>1</integer>
     </map>
@@ -8434,6 +8434,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>RememberUser</key>
+    <map>
+      <key>Comment</key>
+      <string>Keep user name for next login</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>RememberPassword</key>
     <map>
       <key>Comment</key>
@@ -9276,7 +9287,7 @@
   <key>RenderShadowResolutionScale</key>
   <map>
     <key>Comment</key>
-    <string>Scale of shadow map resolution vs. screen resolution</string>
+    <string>Scale of shadow map resolution vs. screen resolution (only positivie values are allowed)</string>
     <key>Persist</key>
     <integer>1</integer>
     <key>Type</key>
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 3ac1c91cea1f61b3b65a99e4c0073c96ccef2ba8..3c3dda1765633a801b8425d9d6fd43ea051e67fb 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -1713,6 +1713,24 @@ void LLAppearanceMgr::slamCategoryLinks(const LLUUID& src_id, const LLUUID& dst_
 	LLInventoryModel::item_array_t* items;
 	LLSD contents = LLSD::emptyArray();
 	gInventory.getDirectDescendentsOf(src_id, cats, items);
+	if (!cats || !items)
+	{
+		// NULL means the call failed -- cats/items map doesn't exist (note: this does NOT mean
+		// that the cat just doesn't have any items or subfolders).
+		LLViewerInventoryCategory* category = gInventory.getCategory(src_id);
+		if (category)
+		{
+			LL_WARNS() << "Category '" << category->getName() << "' descendents corrupted, linking content failed." << LL_ENDL;
+		}
+		else
+		{
+			LL_WARNS() << "Category could not be retrieved, linking content failed." << LL_ENDL;
+		}
+		llassert(cats != NULL && items != NULL);
+
+		return;
+	}
+
 	LL_INFOS() << "copying " << items->size() << " items" << LL_ENDL;
 	for (LLInventoryModel::item_array_t::const_iterator iter = items->begin();
 		 iter != items->end();
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 420841f30899950adc542cbf4ed380cd2a983b94..6273de4b9fc88034987830a8ab6e24059b799def 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -68,6 +68,7 @@
 #include "llviewerwindow.h"
 #include "llviewerdisplay.h"
 #include "llviewermedia.h"
+#include "llviewerparcelaskplay.h"
 #include "llviewerparcelmedia.h"
 #include "llviewermediafocus.h"
 #include "llviewermessage.h"
@@ -670,7 +671,8 @@ LLAppViewer::LLAppViewer()
 	mReportedCrash(false),
 	mNumSessions(0),
 	mPurgeCache(false),
-	mPurgeOnExit(false),
+	mPurgeCacheOnExit(false),
+	mPurgeUserDataOnExit(false),
 	mSecondInstance(false),
 	mSavedFinalSnapshot(false),
 	mSavePerAccountSettings(false),		// don't save settings on logout unless login succeeded.
@@ -1923,6 +1925,11 @@ bool LLAppViewer::cleanup()
 	{
 		gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE);
 		LL_INFOS() << "Saved settings" << LL_ENDL;
+
+		if (LLViewerParcelAskPlay::instanceExists())
+		{
+			LLViewerParcelAskPlay::getInstance()->saveSettings();
+		}
 	}
 
 	std::string warnings_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Warnings"));
@@ -1943,7 +1950,7 @@ bool LLAppViewer::cleanup()
 		LLConversationLog::instance().cache();
 	}
 
-	if (mPurgeOnExit)
+	if (mPurgeCacheOnExit)
 	{
 		LL_INFOS() << "Purging all cache files on exit" << LL_ENDL;
 		gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""), "*.*");
@@ -1984,6 +1991,14 @@ bool LLAppViewer::cleanup()
 		}
 	}
 
+    if (mPurgeUserDataOnExit)
+    {
+        // Ideally we should not save anything from this session since it is going to be purged now,
+        // but this is a very 'rare' case (user deleting himself), not worth overcomplicating 'save&cleanup' code
+        std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + LLStartUp::getUserId();
+        gDirUtilp->deleteDirAndContents(user_path);
+    }
+
 	// Delete workers first
 	// shotdown all worker threads before deleting them in case of co-dependencies
 	mAppCoreHttp.requestStop();
@@ -4462,7 +4477,7 @@ void LLAppViewer::badNetworkHandler()
 	// Flush all of our caches on exit in the case of disconnect due to
 	// invalid packets.
 
-	mPurgeOnExit = TRUE;
+	mPurgeCacheOnExit = TRUE;
 
 	std::ostringstream message;
 	message <<
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 788fe6a19b0eacfce2a004f3a2a26083fa320936..1298ba51e24e5b22f7933c6101969f5331f8931f 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -190,6 +190,7 @@ class LLAppViewer : public LLApp
 
 	void addOnIdleCallback(const boost::function<void()>& cb); // add a callback to fire (once) when idle
 
+	void purgeUserDataOnExit() { mPurgeUserDataOnExit = true; }
 	void purgeCache(); // Clear the local cache. 
 	void purgeCacheImmediate(); //clear local cache immediately.
 	S32  updateTextureThreads(F32 max_time);
@@ -281,7 +282,8 @@ class LLAppViewer : public LLApp
 
 	std::string mSerialNumber;
 	bool mPurgeCache;
-    bool mPurgeOnExit;
+	bool mPurgeCacheOnExit;
+	bool mPurgeUserDataOnExit;
 	LLViewerJoystick* joystick;
 
 	bool mSavedFinalSnapshot;
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 92eeebd705446ad4a8f4bebbbf59fb5197d05aad..f0682dc1ba77a72fd346e60f68bb01d8bf559de3 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -171,7 +171,10 @@ void LLControlAvatar::matchVolumeTransform()
             if (attached_av)
             {
                 LLViewerJointAttachment *attach = attached_av->getTargetAttachmentPoint(mRootVolp);
-                setPositionAgent(mRootVolp->getRenderPosition());
+                if (getRegion() && !isDead())
+                {
+                    setPositionAgent(mRootVolp->getRenderPosition());
+                }
 				attach->updateWorldPRSParent();
                 LLVector3 joint_pos = attach->getWorldPosition();
                 LLQuaternion joint_rot = attach->getWorldRotation();
@@ -227,7 +230,10 @@ void LLControlAvatar::matchVolumeTransform()
 #endif
 			setRotation(bind_rot*obj_rot);
             mRoot->setWorldRotation(bind_rot*obj_rot);
-			setPositionAgent(vol_pos);
+            if (getRegion() && !isDead())
+            {
+                setPositionAgent(vol_pos);
+            }
 			mRoot->setPosition(vol_pos + mPositionConstraintFixup);
 
             F32 global_scale = gSavedSettings.getF32("AnimatedObjectsGlobalScale");
diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp
index f7c61efce07dc93bf1c1fe76ccb62d5190467a10..5539fa75dd4afb23b125514d78b2a310279b1db2 100644
--- a/indra/newview/llconversationlog.cpp
+++ b/indra/newview/llconversationlog.cpp
@@ -490,7 +490,7 @@ bool LLConversationLog::saveToFile(const std::string& filename)
 				(S32)conv_it->getConversationType(),
 				(S32)0,
 				(S32)conv_it->hasOfflineMessages(),
-				conv_it->getConversationName().c_str(),
+				LLURI::escape(conv_it->getConversationName()).c_str(),
 				participant_id.c_str(),
 				conversation_id.c_str(),
 				LLURI::escape(conv_it->getHistoryFileName()).c_str());
@@ -545,7 +545,7 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
 		params.time(LLUnits::Seconds::fromValue(time))
 			.conversation_type((SessionType)stype)
 			.has_offline_ims(has_offline_ims)
-			.conversation_name(conv_name_buffer)
+			.conversation_name(LLURI::unescape(conv_name_buffer))
 			.participant_id(LLUUID(part_id_buffer))
 			.session_id(LLUUID(conv_id_buffer))
 			.history_filename(LLURI::unescape(history_file_name));
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 1587903a1517e6b9fd9fb60f167bda344fb0574e..85ee33edb19234b99736aba2c106c52b4cd3a71e 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -456,7 +456,7 @@ void LLFace::setTextureIndex(U8 index)
 		}
 		else
 		{
-			if (mDrawInfo && !mDrawInfo->mTextureList.empty())
+			if (mDrawInfo && mDrawInfo->mTextureList.size() <= 1)
 			{
 				LL_ERRS() << "Face with no texture index references indexed texture draw info." << LL_ENDL;
 			}
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 5b4b7789b482f4c803266917d053e27bdc4b2ef1..17952349dc28dc6879782d4d1d59f00dd59df2b1 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -1493,18 +1493,24 @@ void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id)
 }
 
 // static
-std::string LLFavoritesOrderStorage::getStoredFavoritesFilename()
+std::string LLFavoritesOrderStorage::getStoredFavoritesFilename(const std::string &grid)
 {
-	std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
+    std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
 
     return (user_dir.empty() ? ""
             : gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
                                              "stored_favorites_"
-                                          + LLGridManager::getInstance()->getGrid()
+                                          + grid
                                           + ".xml")
             );
 }
 
+// static
+std::string LLFavoritesOrderStorage::getStoredFavoritesFilename()
+{
+    return getStoredFavoritesFilename(LLGridManager::getInstance()->getGrid());
+}
+
 // static
 void LLFavoritesOrderStorage::destroyClass()
 {
@@ -1602,6 +1608,64 @@ void LLFavoritesOrderStorage::load()
 	}
 }
 
+// static
+void LLFavoritesOrderStorage::removeFavoritesRecordOfUser(const std::string &user, const std::string &grid)
+{
+    std::string filename = getStoredFavoritesFilename(grid);
+    if (!filename.empty())
+    {
+        LLSD fav_llsd;
+        llifstream file;
+        file.open(filename.c_str());
+        if (file.is_open())
+        {
+            LLSDSerialize::fromXML(fav_llsd, file);
+            file.close();
+
+            // Note : use the "John Doe" and not the "john.doe" version of the name.
+            // See saveFavoritesSLURLs() here above for the reason why.
+            if (fav_llsd.has(user))
+            {
+                LLSD user_llsd = fav_llsd[user];
+
+                if ((user_llsd.beginArray() != user_llsd.endArray()) && user_llsd.beginArray()->has("id"))
+                {
+                    for (LLSD::array_iterator iter = user_llsd.beginArray(); iter != user_llsd.endArray(); ++iter)
+                    {
+                        LLSD value;
+                        value["id"] = iter->get("id").asUUID();
+                        iter->assign(value);
+                    }
+                    fav_llsd[user] = user_llsd;
+                    llofstream file;
+                    file.open(filename.c_str());
+                    if (file.is_open())
+                    {
+                        LLSDSerialize::toPrettyXML(fav_llsd, file);
+                        file.close();
+                    }
+                }
+                else
+                {
+                    LL_INFOS("FavoritesBar") << "Removed favorites for " << user << LL_ENDL;
+                    fav_llsd.erase(user);
+                }
+            }
+
+            llofstream out_file;
+            out_file.open(filename.c_str());
+            if (out_file.is_open())
+            {
+                LLSDSerialize::toPrettyXML(fav_llsd, out_file);
+                LL_INFOS("FavoritesBar") << "saved favorites to '" << filename << "' "
+                    << LL_ENDL;
+                out_file.close();
+            }
+        }
+    }
+}
+
+// static
 void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()
 {
 	std::string filename = getStoredFavoritesFilename();
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index cac32c7f2a6dfce51212e59a0e7e6cf08b28d753..d93161fd7ac4ae8644095aace2999fc11822b000 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -208,9 +208,15 @@ class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage>
 	 * @see cleanup()
 	 */
 	static void destroyClass();
+	static std::string getStoredFavoritesFilename(const std::string &grid);
 	static std::string getStoredFavoritesFilename();
 	static std::string getSavedOrderFileName();
 
+	// Remove record of specified user's favorites from file on disk.
+	static void removeFavoritesRecordOfUser(const std::string &user, const std::string &grid);
+	// Remove record of current user's favorites from file on disk.
+	static void removeFavoritesRecordOfUser();
+
 	BOOL saveFavoritesRecord(bool pref_changed = false);
 	void showFavoritesOnLoginChanged(BOOL show);
 
@@ -232,9 +238,6 @@ class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage>
 
 	void load();
 
-	// Remove record of current user's favorites from file on disk.
-	void removeFavoritesRecordOfUser();
-
 	void onLandmarkLoaded(const LLUUID& asset_id, class LLLandmark* landmark);
 	void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl);
 
diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
index 55561fa1281c35bb39b9c2d93bfb874a979c1eb9..44725cab7023cfbe4eb027fb598b70d4b226cc55 100644
--- a/indra/newview/llfloaterconversationpreview.cpp
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -50,6 +50,7 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i
 	mShowHistory(false),
 	mMessages(NULL),
 	mHistoryThreadsBusy(false),
+	mIsGroup(false),
 	mOpened(false)
 {
 }
@@ -75,6 +76,7 @@ BOOL LLFloaterConversationPreview::postBuild()
 	{
 		name = conv->getConversationName();
 		file = conv->getHistoryFileName();
+		mIsGroup = (LLIMModel::LLIMSession::GROUP_SESSION == conv->getConversationType());
 	}
 	else
 	{
@@ -82,6 +84,10 @@ BOOL LLFloaterConversationPreview::postBuild()
 		file = "chat";
 	}
 	mChatHistoryFileName = file;
+	if (mIsGroup)
+	{
+		mChatHistoryFileName += GROUP_CHAT_SUFFIX;
+	}
 	LLStringUtil::format_map_t args;
 	args["[NAME]"] = name;
 	std::string title = getString("Title", args);
@@ -145,6 +151,7 @@ void LLFloaterConversationPreview::onOpen(const LLSD& key)
 	LLSD load_params;
 	load_params["load_all_history"] = true;
 	load_params["cut_off_todays_date"] = false;
+	load_params["is_group"] = mIsGroup;
 
 	// The temporary message list with "Loading..." text
 	// Will be deleted upon loading completion in setPages() method
diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h
index a8dbbc9ffe0c112721f984dfcd1dd821afbe82e4..7ca4ee6945cceb3e6230cb7a0231f9f171146574 100644
--- a/indra/newview/llfloaterconversationpreview.h
+++ b/indra/newview/llfloaterconversationpreview.h
@@ -66,6 +66,7 @@ class LLFloaterConversationPreview : public LLFloater
 	bool			mShowHistory;
 	bool			mHistoryThreadsBusy;
 	bool			mOpened;
+	bool			mIsGroup;
 };
 
 #endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */
diff --git a/indra/newview/llfloaterforgetuser.cpp b/indra/newview/llfloaterforgetuser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..97b022699f1abaf0131165d8f347359d6b0f3a27
--- /dev/null
+++ b/indra/newview/llfloaterforgetuser.cpp
@@ -0,0 +1,348 @@
+/** 
+ * @file llfloaterforgetuser.cpp
+ * @brief LLFloaterForgetUser class definition.
+ *
+ * $LicenseInfo:firstyear=2019&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2019, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterforgetuser.h"
+
+#include "llappviewer.h"
+#include "llcheckboxctrl.h"
+#include "llfavoritesbar.h"
+#include "llnotificationsutil.h"
+#include "llpanellogin.h"        // for helper function getUserName() and to repopulate list if nessesary
+#include "llscrolllistctrl.h"
+#include "llsecapi.h"
+#include "llstartup.h"
+#include "llviewercontrol.h"
+#include "llviewernetwork.h"
+
+
+LLFloaterForgetUser::LLFloaterForgetUser(const LLSD &key)
+    : LLFloater("floater_forget_user"),
+    mLoginPanelDirty(false)
+{
+
+}
+
+LLFloaterForgetUser::~LLFloaterForgetUser()
+{
+    if (mLoginPanelDirty)
+    {
+        LLPanelLogin::resetFields();
+    }
+}
+
+BOOL LLFloaterForgetUser::postBuild()
+{
+    mScrollList = getChild<LLScrollListCtrl>("user_list");
+
+
+    bool show_grid_marks = gSavedSettings.getBOOL("ForceShowGrid");
+    show_grid_marks |= !LLGridManager::getInstance()->isInProductionGrid();
+
+    std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+
+    if (!show_grid_marks)
+    {
+        // Figure out if there are records for more than one grid in storage
+        for (std::map<std::string, std::string>::iterator grid_iter = known_grids.begin();
+            grid_iter != known_grids.end();
+            grid_iter++)
+        {
+            if (!grid_iter->first.empty()
+                && grid_iter->first != MAINGRID) // a workaround since 'mIsInProductionGrid' might not be set
+            {
+                if (!gSecAPIHandler->emptyCredentialMap("login_list", grid_iter->first))
+                {
+                    show_grid_marks = true;
+                    break;
+                }
+
+                // "Legacy" viewer support
+                LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid_iter->first);
+                if (cred.notNull())
+                {
+                    const LLSD &ident = cred->getIdentifier();
+                    if (ident.isMap() && ident.has("type"))
+                    {
+                        show_grid_marks = true;
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    mUserGridsCount.clear();
+    if (!show_grid_marks)
+    {
+        // just load maingrid
+        loadGridToList(MAINGRID, false);
+    }
+    else
+    {
+        for (std::map<std::string, std::string>::iterator grid_iter = known_grids.begin();
+            grid_iter != known_grids.end();
+            grid_iter++)
+        {
+            if (!grid_iter->first.empty())
+            {
+                loadGridToList(grid_iter->first, true);
+            }
+        }
+    }
+
+    mScrollList->selectFirstItem();
+    bool enable_button = mScrollList->getFirstSelectedIndex() != -1;
+    LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
+    chk_box->setEnabled(enable_button);
+    chk_box->set(FALSE);
+    LLButton *button = getChild<LLButton>("forget");
+    button->setEnabled(enable_button);
+    button->setCommitCallback(boost::bind(&LLFloaterForgetUser::onForgetClicked, this));
+
+    return TRUE;
+}
+
+void LLFloaterForgetUser::onForgetClicked()
+{
+    LLScrollListCtrl *scroll_list = getChild<LLScrollListCtrl>("user_list");
+    LLSD user_data = scroll_list->getSelectedValue();
+    const std::string user_id = user_data["user_id"];
+
+    LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
+    BOOL delete_data = chk_box->getValue();
+
+    if (delete_data && mUserGridsCount[user_id] > 1)
+    {
+        // more than 1 grid uses this id
+        LLNotificationsUtil::add("LoginRemoveMultiGridUserData", LLSD(), LLSD(), boost::bind(&LLFloaterForgetUser::onConfirmForget, this, _1, _2));
+        return;
+    }
+
+    processForgetUser();
+}
+
+bool LLFloaterForgetUser::onConfirmForget(const LLSD& notification, const LLSD& response)
+{
+    S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+    if (option == 0)
+    {
+        processForgetUser();
+    }
+    return false;
+}
+
+// static 
+bool LLFloaterForgetUser::onConfirmLogout(const LLSD& notification, const LLSD& response, const std::string &fav_id, const std::string &grid)
+{
+    S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+    if (option == 0)
+    {
+        // Remove creds
+        gSecAPIHandler->removeFromCredentialMap("login_list", grid, LLStartUp::getUserId());
+
+        LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid);
+        if (cred.notNull() && cred->userID() == LLStartUp::getUserId())
+        {
+            gSecAPIHandler->deleteCredential(cred);
+        }
+
+        // Clean favorites
+        LLFavoritesOrderStorage::removeFavoritesRecordOfUser(fav_id, grid);
+
+        // mark data for removal
+        LLAppViewer::instance()->purgeUserDataOnExit();
+        LLAppViewer::instance()->requestQuit();
+    }
+    return false;
+}
+
+void LLFloaterForgetUser::processForgetUser()
+{
+    LLScrollListCtrl *scroll_list = getChild<LLScrollListCtrl>("user_list");
+    LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
+    BOOL delete_data = chk_box->getValue();
+    LLSD user_data = scroll_list->getSelectedValue();
+    const std::string user_id = user_data["user_id"];
+    const std::string grid = user_data["grid"];
+    const std::string user_name = user_data["label"]; // for favorites
+
+    if (delete_data && user_id == LLStartUp::getUserId() && LLStartUp::getStartupState() > STATE_LOGIN_WAIT)
+    {
+        // we can't delete data for user that is currently logged in
+        // we need to pass grid because we are deleting data universal to grids, but specific grid's user
+        LLNotificationsUtil::add("LoginCantRemoveCurUsername", LLSD(), LLSD(), boost::bind(onConfirmLogout, _1, _2, user_name, grid));
+        return;
+    }
+
+    // key is used for name of user's folder and in credencials
+    // user_name is edentical to favorite's username
+    forgetUser(user_id, user_name, grid, delete_data);
+    mLoginPanelDirty = true;
+    if (delete_data)
+    {
+        mUserGridsCount[user_id] = 0; //no data left to care about
+    }
+    else
+    {
+        mUserGridsCount[user_id]--;
+    }
+
+    // Update UI
+    scroll_list->deleteSelectedItems();
+    scroll_list->selectFirstItem();
+    if (scroll_list->getFirstSelectedIndex() == -1)
+    {
+        LLButton *button = getChild<LLButton>("forget");
+        button->setEnabled(false);
+        chk_box->setEnabled(false);
+    }
+}
+
+//static
+void LLFloaterForgetUser::forgetUser(const std::string &userid, const std::string &fav_id, const std::string &grid, bool delete_data)
+{
+    // Remove creds
+    gSecAPIHandler->removeFromCredentialMap("login_list", grid, userid);
+
+    LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid);
+    if (cred.notNull() && cred->userID() == userid)
+    {
+        gSecAPIHandler->deleteCredential(cred);
+    }
+
+    // Clean data
+    if (delete_data)
+    {
+        std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + userid;
+        gDirUtilp->deleteDirAndContents(user_path);
+
+        // Clean favorites
+        LLFavoritesOrderStorage::removeFavoritesRecordOfUser(fav_id, grid);
+
+        // Note: we do not clean user-related files from cache because there are id dependent (inventory)
+        // files and cache has separate cleaning mechanism either way.
+        // Also this only cleans user from current grid, not all of them.
+    }
+}
+
+void LLFloaterForgetUser::loadGridToList(const std::string &grid, bool show_grid_name)
+{
+    std::string grid_label;
+    if (show_grid_name)
+    {
+        grid_label = LLGridManager::getInstance()->getGridId(grid); //login id (shortened label)
+    }
+    if (gSecAPIHandler->hasCredentialMap("login_list", grid))
+    {
+        LLSecAPIHandler::credential_map_t credencials;
+        gSecAPIHandler->loadCredentialMap("login_list", grid, credencials);
+
+        LLSecAPIHandler::credential_map_t::iterator cr_iter = credencials.begin();
+        LLSecAPIHandler::credential_map_t::iterator cr_end = credencials.end();
+        while (cr_iter != cr_end)
+        {
+            if (cr_iter->second.notNull()) // basic safety
+            {
+                std::string user_label = LLPanelLogin::getUserName(cr_iter->second);
+                LLSD user_data;
+                user_data["user_id"] = cr_iter->first;
+                user_data["label"] = user_label;
+                user_data["grid"] = grid;
+
+                if (show_grid_name)
+                {
+                    user_label += " (" + grid_label + ")";
+                }
+
+                LLScrollListItem::Params item_params;
+                item_params.value(user_data);
+                item_params.columns.add()
+                    .value(user_label)
+                    .column("user")
+                    .font(LLFontGL::getFontSansSerifSmall());
+                mScrollList->addRow(item_params, ADD_BOTTOM);
+
+                // Add one to grid count
+                std::map<std::string, S32>::iterator found = mUserGridsCount.find(cr_iter->first);
+                if (found != mUserGridsCount.end())
+                {
+                    found->second++;
+                }
+                else
+                {
+                    mUserGridsCount[cr_iter->first] = 1;
+                }
+            }
+            cr_iter++;
+        }
+    }
+    else
+    {
+        // "Legacy" viewer support
+        LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid);
+        if (cred.notNull())
+        {
+            const LLSD &ident = cred->getIdentifier();
+            if (ident.isMap() && ident.has("type"))
+            {
+                std::string user_label = LLPanelLogin::getUserName(cred);
+                LLSD user_data;
+                user_data["user_id"] = cred->userID();
+                user_data["label"] = user_label;
+                user_data["grid"] = grid;
+
+                if (show_grid_name)
+                {
+                    user_label += " (" + grid_label + ")";
+                }
+
+                LLScrollListItem::Params item_params;
+                item_params.value(user_data);
+                item_params.columns.add()
+                    .value(user_label)
+                    .column("user")
+                    .font(LLFontGL::getFontSansSerifSmall());
+                mScrollList->addRow(item_params, ADD_BOTTOM);
+
+                // Add one to grid count
+                std::map<std::string, S32>::iterator found = mUserGridsCount.find(cred->userID());
+                if (found != mUserGridsCount.end())
+                {
+                    found->second++;
+                }
+                else
+                {
+                    mUserGridsCount[cred->userID()] = 1;
+                }
+            }
+        }
+    }
+}
+
+
diff --git a/indra/newview/llfloaterforgetuser.h b/indra/newview/llfloaterforgetuser.h
new file mode 100644
index 0000000000000000000000000000000000000000..801fcbb4127b78920c32f98befb248d99f60c3b9
--- /dev/null
+++ b/indra/newview/llfloaterforgetuser.h
@@ -0,0 +1,56 @@
+/** 
+ * @file llfloaterforgetuser.h
+ * @brief LLFloaterForgetUser class declaration.
+ *
+ * $LicenseInfo:firstyear=2019&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2019, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERFORGETUSER_H
+#define LL_LLFLOATERFORGETUSER_H
+
+#include "llfloater.h"
+
+class LLScrollListCtrl;
+
+class LLFloaterForgetUser : public LLFloater
+{
+public:
+    LLFloaterForgetUser(const LLSD &key);
+    ~LLFloaterForgetUser();
+
+    BOOL postBuild();
+    void onForgetClicked();
+
+private:
+    bool onConfirmForget(const LLSD& notification, const LLSD& response);
+    static bool onConfirmLogout(const LLSD& notification, const LLSD& response, const std::string &favorites_id, const std::string &grid);
+    void processForgetUser();
+    static void forgetUser(const std::string &userid, const std::string &fav_id, const std::string &grid, bool delete_data);
+    void loadGridToList(const std::string &grid, bool show_grid_name);
+
+    LLScrollListCtrl *mScrollList;
+
+    bool mLoginPanelDirty;
+    std::map<std::string, S32> mUserGridsCount;
+};
+
+#endif
diff --git a/indra/newview/llfloatergroupinvite.cpp b/indra/newview/llfloatergroupinvite.cpp
index 7fdba8734a6cac29dcd180aa99a21b73003bccdc..30c90ac184f3ef36f8149115ac1cdfa8d40ea06c 100644
--- a/indra/newview/llfloatergroupinvite.cpp
+++ b/indra/newview/llfloatergroupinvite.cpp
@@ -108,7 +108,7 @@ LLFloaterGroupInvite::~LLFloaterGroupInvite()
 }
 
 // static
-void LLFloaterGroupInvite::showForGroup(const LLUUID& group_id, uuid_vec_t *agent_ids)
+void LLFloaterGroupInvite::showForGroup(const LLUUID& group_id, uuid_vec_t *agent_ids, bool request_update)
 {
 	const LLFloater::Params& floater_params = LLFloater::getDefaultParams();
 	S32 floater_header_size = floater_params.header_height;
@@ -126,9 +126,12 @@ void LLFloaterGroupInvite::showForGroup(const LLUUID& group_id, uuid_vec_t *agen
 											 group_id,
 											 (LLFloaterGroupInvite*)NULL);
 
-	// refresh group information
-	gAgent.sendAgentDataUpdateRequest();
-	LLGroupMgr::getInstance()->clearGroupData(group_id);
+	if (request_update)
+	{
+		// refresh group information
+		gAgent.sendAgentDataUpdateRequest();
+		LLGroupMgr::getInstance()->clearGroupData(group_id);
+	}
 
 
 	if (!fgi)
diff --git a/indra/newview/llfloatergroupinvite.h b/indra/newview/llfloatergroupinvite.h
index f6a3ca55509b6c2a7e6c2b3b50a9e7fb50c4f58d..657e5711f0fdebf9ac043fdf27fd9b110d0a9447 100644
--- a/indra/newview/llfloatergroupinvite.h
+++ b/indra/newview/llfloatergroupinvite.h
@@ -37,7 +37,7 @@ class LLFloaterGroupInvite
 public:
 	virtual ~LLFloaterGroupInvite();
 
-	static void showForGroup(const LLUUID &group_id, uuid_vec_t *agent_ids = NULL);
+	static void showForGroup(const LLUUID &group_id, uuid_vec_t *agent_ids = NULL, bool request_update = true);
 
 protected:
 	LLFloaterGroupInvite(const LLUUID& group_id = LLUUID::null);
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 3098c6d11831c941fd2d769dadd3cb55df5b462a..d8f4360142e5ac4ba8c8f96cf01376f90f76a9ac 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2209,7 +2209,7 @@ void LLPanelLandOptions::refreshSearch()
 	// effort to reduce search spam from small parcels.  See also
 	// the search crawler "grid-crawl.py" in secondlife.com/doc/app/search/ JC
 	const S32 MIN_PARCEL_AREA_FOR_SEARCH = 128;
-	bool large_enough = parcel->getArea() > MIN_PARCEL_AREA_FOR_SEARCH;
+	bool large_enough = parcel->getArea() >= MIN_PARCEL_AREA_FOR_SEARCH;
 	if (large_enough)
 	{
 		if (can_change)
diff --git a/indra/newview/llfloaterlinkreplace.cpp b/indra/newview/llfloaterlinkreplace.cpp
index 10cce3bd22dcd5ff255bfe46405e7597916fc008..595d584799d2171765778d1505c99da818a7b174 100644
--- a/indra/newview/llfloaterlinkreplace.cpp
+++ b/indra/newview/llfloaterlinkreplace.cpp
@@ -32,6 +32,8 @@
 #include "llagent.h"
 #include "llappearancemgr.h"
 #include "lllineeditor.h"
+#include "llnotificationsutil.h"
+#include "llnotifications.h"
 #include "lltextbox.h"
 #include "llviewercontrol.h"
 
@@ -142,37 +144,72 @@ void LLFloaterLinkReplace::onStartClicked()
 		LL_WARNS() << "Cannot replace. Source and target are identical." << LL_ENDL;
 		return;
 	}
+	
+	const LLUUID& source_item_id = gInventory.getLinkedItemID(mSourceUUID);
+	LLViewerInventoryItem *source_item = gInventory.getItem(source_item_id);
+	const LLUUID& target_item_id = gInventory.getLinkedItemID(mTargetUUID);
+	LLViewerInventoryItem *target_item = gInventory.getItem(target_item_id);
 
-	LLInventoryModel::cat_array_t cat_array;
-	LLLinkedItemIDMatches is_linked_item_match(mSourceUUID);
-	gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
-									cat_array,
-									mRemainingInventoryItems,
-									LLInventoryModel::INCLUDE_TRASH,
-									is_linked_item_match);
-	LL_INFOS() << "Found " << mRemainingInventoryItems.size() << " inventory links that need to be replaced." << LL_ENDL;
 
-	if (mRemainingInventoryItems.size() > 0)
+	LLNotification::Params params("ConfirmReplaceLink");
+	params.functor.function(boost::bind(&LLFloaterLinkReplace::onStartClickedResponse, this, _1, _2));
+	if (source_item && source_item->isWearableType() && source_item->getWearableType() <= LLWearableType::WT_EYES)
 	{
-		LLViewerInventoryItem* target_item = gInventory.getItem(mTargetUUID);
-		if (target_item)
+		if(target_item && target_item->isWearableType() && source_item->getWearableType() == target_item->getWearableType())
 		{
-			mRemainingItems = (U32)mRemainingInventoryItems.size();
-
-			LLStringUtil::format_map_t args;
-			args["NUM"] = llformat("%d", mRemainingItems);
-			mStatusText->setText(getString("ItemsRemaining", args));
-
-			mStartBtn->setEnabled(FALSE);
-			mRefreshBtn->setEnabled(FALSE);
-
-			mEventTimer.start();
-			tick();
+			LLNotifications::instance().forceResponse(params, 0);
 		}
 		else
 		{
-			mStatusText->setText(getString("TargetNotFound"));
-			LL_WARNS() << "Link replace target not found." << LL_ENDL;
+			LLSD args;
+			args["TYPE"] = LLWearableType::getTypeName(source_item->getWearableType());
+			params.substitutions(args);
+			LLNotifications::instance().add(params);
+		}
+	}
+	else
+	{		
+		LLNotifications::instance().forceResponse(params, 0);
+	}
+}
+
+void LLFloaterLinkReplace::onStartClickedResponse(const LLSD& notification, const LLSD& response)
+{
+
+	if (LLNotificationsUtil::getSelectedOption(notification, response) == 0)
+	{
+	
+		LLInventoryModel::cat_array_t cat_array;
+		LLLinkedItemIDMatches is_linked_item_match(mSourceUUID);
+		gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
+			cat_array,
+			mRemainingInventoryItems,
+			LLInventoryModel::INCLUDE_TRASH,
+			is_linked_item_match);
+		LL_INFOS() << "Found " << mRemainingInventoryItems.size() << " inventory links that need to be replaced." << LL_ENDL;
+
+		if (mRemainingInventoryItems.size() > 0)
+		{
+			LLViewerInventoryItem* target_item = gInventory.getItem(mTargetUUID);
+			if (target_item)
+			{
+				mRemainingItems = (U32)mRemainingInventoryItems.size();
+
+				LLStringUtil::format_map_t args;
+				args["NUM"] = llformat("%d", mRemainingItems);
+				mStatusText->setText(getString("ItemsRemaining", args));
+
+				mStartBtn->setEnabled(FALSE);
+				mRefreshBtn->setEnabled(FALSE);
+
+				mEventTimer.start();
+				tick();
+			}
+			else
+			{
+				mStatusText->setText(getString("TargetNotFound"));
+				LL_WARNS() << "Link replace target not found." << LL_ENDL;
+			}
 		}
 	}
 }
diff --git a/indra/newview/llfloaterlinkreplace.h b/indra/newview/llfloaterlinkreplace.h
index dd5c3012061fd89313b8b42afdf23182ff1b692e..060773f93e769d3e001bd3ba5a7923299a0fcd90 100644
--- a/indra/newview/llfloaterlinkreplace.h
+++ b/indra/newview/llfloaterlinkreplace.h
@@ -94,6 +94,7 @@ class LLFloaterLinkReplace : public LLFloater, LLEventTimer
 private:
 	void checkEnableStart();
 	void onStartClicked();
+	void onStartClickedResponse(const LLSD& notification, const LLSD& response);
 	void decreaseOpenItemCount();
 	void updateFoundLinks();
 	void processBatch(LLInventoryModel::item_array_t items);
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index e0a3585c9342c9b216267a84bc0d263e0deadf0a..bcb0dfe856fa5dca4a76faced1e3aba59be837fe 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -419,6 +419,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	mCommitCallbackRegistrar.add("Pref.TranslationSettings",	boost::bind(&LLFloaterPreference::onClickTranslationSettings, this));
 	mCommitCallbackRegistrar.add("Pref.AutoReplace",            boost::bind(&LLFloaterPreference::onClickAutoReplace, this));
 	mCommitCallbackRegistrar.add("Pref.PermsDefault",           boost::bind(&LLFloaterPreference::onClickPermsDefault, this));
+	mCommitCallbackRegistrar.add("Pref.RememberedUsernames",    boost::bind(&LLFloaterPreference::onClickRememberedUsernames, this));
 	mCommitCallbackRegistrar.add("Pref.SpellChecker",           boost::bind(&LLFloaterPreference::onClickSpellChecker, this));
 	mCommitCallbackRegistrar.add("Pref.Advanced",				boost::bind(&LLFloaterPreference::onClickAdvanced, this));
 
@@ -1241,7 +1242,7 @@ void LLFloaterPreference::buildPopupLists()
 		LLNotificationFormPtr formp = templatep->mForm;
 		
 		LLNotificationForm::EIgnoreType ignore = formp->getIgnoreType();
-		if (ignore == LLNotificationForm::IGNORE_NO)
+		if (ignore <= LLNotificationForm::IGNORE_NO)
 			continue;
 		
 		LLSD row;
@@ -1823,7 +1824,7 @@ void LLFloaterPreference::resetAllIgnored()
 		 iter != LLNotifications::instance().templatesEnd();
 		 ++iter)
 	{
-		if (iter->second->mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO)
+		if (iter->second->mForm->getIgnoreType() > LLNotificationForm::IGNORE_NO)
 		{
 			iter->second->mForm->setIgnored(false);
 		}
@@ -1836,7 +1837,7 @@ void LLFloaterPreference::setAllIgnored()
 		 iter != LLNotifications::instance().templatesEnd();
 		 ++iter)
 	{
-		if (iter->second->mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO)
+		if (iter->second->mForm->getIgnoreType() > LLNotificationForm::IGNORE_NO)
 		{
 			iter->second->mForm->setIgnored(true);
 		}
@@ -2256,6 +2257,11 @@ void LLFloaterPreference::onClickPermsDefault()
 	LLFloaterReg::showInstance("perms_default");
 }
 
+void LLFloaterPreference::onClickRememberedUsernames()
+{
+    LLFloaterReg::showInstance("forget_username");
+}
+
 void LLFloaterPreference::onDeleteTranscripts()
 {
 	LLSD args;
@@ -2668,7 +2674,7 @@ void LLPanelPreference::updateMediaAutoPlayCheckbox(LLUICtrl* ctrl)
 		bool music_enabled = getChild<LLCheckBoxCtrl>("enable_music")->get();
 		bool media_enabled = getChild<LLCheckBoxCtrl>("enable_media")->get();
 
-		getChild<LLCheckBoxCtrl>("media_auto_play_btn")->setEnabled(music_enabled || media_enabled);
+		getChild<LLCheckBoxCtrl>("media_auto_play_combo")->setEnabled(music_enabled || media_enabled);
 	}
 }
 
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index d46f0deb7aea1ecaee87f9eb0af9854630cc78e2..4412c9547313f499d3084107a9c3dd24687af075 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -168,7 +168,6 @@ class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver,
 	
 	void refreshUI();
 
-	void onCommitParcelMediaAutoPlayEnable();
 	void onCommitMediaEnabled();
 	void onCommitMusicEnabled();
 	void applyResolution();
@@ -181,6 +180,7 @@ class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver,
 	void onClickProxySettings();
 	void onClickTranslationSettings();
 	void onClickPermsDefault();
+	void onClickRememberedUsernames();
 	void onClickAutoReplace();
 	void onClickSpellChecker();
 	void onClickRenderExceptions();
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index e3705e82b926984670bea0ccc7285a9d7aa20bef..61c8a3a89830f0a602216773c7bfeadba30e4cbd 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -29,6 +29,7 @@
 #include "llimprocessing.h"
 
 #include "llagent.h"
+#include "llappviewer.h"
 #include "llavatarnamecache.h"
 #include "llfirstuse.h"
 #include "llfloaterreg.h"
@@ -1474,6 +1475,7 @@ void LLIMProcessing::requestOfflineMessages()
     static BOOL requested = FALSE;
     if (!requested
         && gMessageSystem
+        && !gDisconnected
         && LLMuteList::getInstance()->isLoaded()
         && isAgentAvatarValid()
         && gAgent.getRegion()
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index e331a51bda76220197e21dc08c9078fce942c966..d5142a4496a9b2bc3e9a6c2894d80a6ba3a73f7d 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -843,7 +843,7 @@ void LLIMModel::LLIMSession::loadHistory()
 		std::list<LLSD> chat_history;
 
 		//involves parsing of a chat history
-		LLLogChat::loadChatHistory(mHistoryFileName, chat_history);
+		LLLogChat::loadChatHistory(mHistoryFileName, chat_history, LLSD(), isGroupChat());
 		addMessagesFromHistory(chat_history);
 	}
 }
@@ -907,6 +907,11 @@ bool LLIMModel::LLIMSession::isP2P()
 	return IM_NOTHING_SPECIAL == mType;
 }
 
+bool LLIMModel::LLIMSession::isGroupChat()
+{
+	return IM_SESSION_GROUP_START == mType || (IM_SESSION_INVITE == mType && gAgent.isInGroup(mSessionID));
+}
+
 bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
 {
 	return !mOtherParticipantIsAvatar;
@@ -964,6 +969,10 @@ void LLIMModel::LLIMSession::buildHistoryFileName()
 			mHistoryFileName = LLCacheName::buildUsername(mName);
 		}
 	}
+	else if (isGroupChat())
+	{
+		mHistoryFileName = mName + GROUP_CHAT_SUFFIX;
+	}
 }
 
 //static
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 2a9e4679a8bd1dd8447ee8dbe42aab39f82edec3..79c831ebb6a6981d2f3695ee43c6bdc003bb615f 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -91,6 +91,7 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 		bool isOutgoingAdHoc() const;
 		bool isAdHoc();
 		bool isP2P();
+		bool isGroupChat();
 		bool isOtherParticipantAvaline();
 
 		bool isP2PSessionType() const { return mSessionType == P2P_SESSION;}
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index d4993a1091a2cfa225a031e016d1a69faccc55e5..6f461673ee0580752b9b88a9b35aae8e057e97f0 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -291,7 +291,6 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
 	if (!gSavedSettings.getBOOL("InventoryOutboxMakeVisible"))
 	{
 		getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
-		getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));
 	}
     // hide marketplace listing box, unless we are a marketplace panel
 	if (!gSavedSettings.getBOOL("InventoryOutboxMakeVisible") && !mParams.use_marketplace_folders)
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 453bf17b119bf9fef9c8eff362a8272d498dd61e..0c64531783b6cfa32c73626fd068dc313bfb4373 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -67,6 +67,8 @@ const std::string LL_IM_FROM("from");
 const std::string LL_IM_FROM_ID("from_id");
 const std::string LL_TRANSCRIPT_FILE_EXTENSION("txt");
 
+const std::string GROUP_CHAT_SUFFIX(" (group)");
+
 const static char IM_SYMBOL_SEPARATOR(':');
 const static std::string IM_SEPARATOR(std::string() + IM_SYMBOL_SEPARATOR + " ");
 const static std::string NEW_LINE("\n");
@@ -355,7 +357,7 @@ void LLLogChat::saveHistory(const std::string& filename,
 }
 
 // static
-void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
+void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params, bool is_group)
 {
 	if (file_name.empty())
 	{
@@ -368,10 +370,25 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m
 	LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
 	if (!fptr)
 	{
-		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+		if (is_group)
+		{
+			std::string old_name(file_name);
+			old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size());
+			fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "r");
+			if (fptr)
+			{
+				fclose(fptr);
+				LLFile::copy(LLLogChat::makeLogFileName(old_name), LLLogChat::makeLogFileName(file_name));
+			}
+			fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");
+		}
 		if (!fptr)
 		{
-			return;						//No previous conversation with this name.
+			fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+			if (!fptr)
+			{
+				return;						//No previous conversation with this name.
+			}
 		}
 	}
 
@@ -1053,12 +1070,28 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
 
 	if (!fptr)
 	{
-		fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+		bool is_group = load_params.has("is_group") ? load_params["is_group"].asBoolean() : false;
+		if (is_group)
+		{
+			std::string old_name(file_name);
+			old_name.erase(old_name.size() - GROUP_CHAT_SUFFIX.size());
+			fptr = LLFile::fopen(LLLogChat::makeLogFileName(old_name), "r");
+			if (fptr)
+			{
+				fclose(fptr);
+				LLFile::copy(LLLogChat::makeLogFileName(old_name), LLLogChat::makeLogFileName(file_name));
+			}
+			fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");
+		}
 		if (!fptr)
 		{
-			mNewLoad = false;
-			(*mLoadEndSignal)(messages, file_name);
-			return;						//No previous conversation with this name.
+			fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+			if (!fptr)
+			{
+				mNewLoad = false;
+				(*mLoadEndSignal)(messages, file_name);
+				return;						//No previous conversation with this name.
+			}
 		}
 	}
 
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index b71a34ae0aaac1a7b6d3cc3c0b05637b8417e35f..8b7fe14e1684ad4c6c4b7596a09aaa948978f154 100644
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -106,7 +106,7 @@ class LLLogChat : public LLSingleton<LLLogChat>
 	static void getListOfTranscriptFiles(std::vector<std::string>& list);
 	static void getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions);
 
-	static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD());
+	static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD(), bool is_group = false);
 
 	typedef boost::signals2::signal<void ()> save_history_signal_t;
 	boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb);
@@ -196,6 +196,7 @@ class LLChatLogParser
 	virtual ~LLChatLogParser() {};
 };
 
+extern const std::string GROUP_CHAT_SUFFIX;
 
 // LLSD map lookup constants
 extern const std::string LL_IM_TIME; //("time");
diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp
index eca34c0d4d47ae1bf7521ee1175b370bd1ddfba9..22cedf450eb9a009c2fe422573ba51ad9d634d80 100644
--- a/indra/newview/llloginhandler.cpp
+++ b/indra/newview/llloginhandler.cpp
@@ -139,8 +139,11 @@ LLPointer<LLCredential> LLLoginHandler::initializeLoginInfo()
 	// so try to load it from the UserLoginInfo                                                                          
 	result = loadSavedUserLoginInfo();                                                                                   
 	if (result.isNull())                                                                                                 
-	{                                                                                                                    
-		result =  gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());                       
+	{
+        // Since legacy viewer store login info one per grid, newer viewers have to
+        // reuse same information to remember last user and for compatibility,
+        // but otherwise login info is stored in separate map in gSecAPIHandler
+        result = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
 	}                                                                                                                    
 	
 	return result;                                                                                                       
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index b399ab9bc4f5d0dd11e7c36b834b6fae06ab3c78..0affe8efb4b51f15efb57b8560ade06b949b4e08 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -202,11 +202,28 @@ BOOL LLMediaCtrl::handleScrollWheel( S32 x, S32 y, S32 clicks )
 {
 	if (LLPanel::handleScrollWheel(x, y, clicks)) return TRUE;
 	if (mMediaSource && mMediaSource->hasMedia())
-		mMediaSource->getMediaPlugin()->scrollEvent(0, clicks, gKeyboard->currentMask(TRUE));
+	{
+		convertInputCoords(x, y);
+		mMediaSource->scrollWheel(x, y, 0, clicks, gKeyboard->currentMask(TRUE));
+	}
 
 	return TRUE;
 }
 
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleScrollHWheel(S32 x, S32 y, S32 clicks)
+{
+    if (LLPanel::handleScrollHWheel(x, y, clicks)) return TRUE;
+    if (mMediaSource && mMediaSource->hasMedia())
+    {
+        convertInputCoords(x, y);
+        mMediaSource->scrollWheel(x, y, clicks, 0, gKeyboard->currentMask(TRUE));
+    }
+
+    return TRUE;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 //	virtual 
 BOOL LLMediaCtrl::handleToolTip(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 11400c82742cb624df901cf222ffe36f846ba2a8..958c76f2613fb855a94ab3a4a0b03ce24ccb3f92 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -92,6 +92,7 @@ class LLMediaCtrl :
 		virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
 		virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
 		virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
+		virtual BOOL handleScrollHWheel( S32 x, S32 y, S32 clicks );
 		virtual BOOL handleToolTip(S32 x, S32 y, MASK mask);
 
 		// navigation
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 8fc356c9282045bbe75dded7e944ac2c95aa083d..54409a69943fb201bec596cfad43d18d656fefa5 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -574,6 +574,8 @@ BOOL LLPanelStandStopFlying::postBuild()
 	//mStopFlyingButton->setCommitCallback(boost::bind(&LLFloaterMove::setFlyingMode, FALSE));
 	mStopFlyingButton->setCommitCallback(boost::bind(&LLPanelStandStopFlying::onStopFlyingButtonClick, this));
 	mStopFlyingButton->setVisible(FALSE);
+
+	gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLPanelStandStopFlying::updatePosition, this));
 	
 	return TRUE;
 }
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 6d0c30fbf336917ddb1630503979178e3ff26464..c0342eef4e4de70ffe4e5b4101364c5a93946024 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -764,6 +764,7 @@ void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType t
 			setClassifiedName(c_info->name);
 			setDescription(c_info->description);
 			setSnapshotId(c_info->snapshot_id);
+			setParcelId(c_info->parcel_id);
 			setPosGlobal(c_info->pos_global);
 
 			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 0efb234015b52252f745b9798eefdd92ac554b3b..e3d75d5604d7368ed74d093e5444d325d9d67a58 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -1153,7 +1153,7 @@ void LLPanelGroupMembersSubTab::onInviteMember(void *userdata)
 
 void LLPanelGroupMembersSubTab::handleInviteMember()
 {
-	LLFloaterGroupInvite::showForGroup(mGroupID);
+	LLFloaterGroupInvite::showForGroup(mGroupID, NULL, false);
 }
 
 void LLPanelGroupMembersSubTab::onEjectMembers(void *userdata)
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index e253557797de8c149132fbffcde1d8a1fce24e05..7ef3685cdb2158aabbedcc7c5efdabd8973d5992 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -77,6 +77,60 @@ LLPanelLogin *LLPanelLogin::sInstance = NULL;
 BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
 BOOL LLPanelLogin::sCredentialSet = FALSE;
 
+// Helper functions
+
+LLPointer<LLCredential> load_user_credentials(std::string &user_key)
+{
+    if (gSecAPIHandler->hasCredentialMap("login_list", LLGridManager::getInstance()->getGrid()))
+    {
+        // user_key should be of "name Resident" format
+        return gSecAPIHandler->loadFromCredentialMap("login_list", LLGridManager::getInstance()->getGrid(), user_key);
+    }
+    else
+    {
+        // legacy (or legacy^2, since it also tries to load from settings)
+        return gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+    }
+}
+
+// keys are lower case to be case insensitive so they are not always
+// identical to names which retain user input, like:
+// "AwEsOmE Resident" -> "awesome_resident"
+std::string get_user_key_from_name(const std::string &username)
+{
+    std::string key = username;
+    LLStringUtil::trim(key);
+    LLStringUtil::toLower(key);
+    if (!LLGridManager::getInstance()->isSystemGrid())
+    {
+        size_t separator_index = username.find_first_of(" ");
+        if (separator_index == username.npos)
+        {
+            // CRED_IDENTIFIER_TYPE_ACCOUNT
+            return key;
+        }
+    }
+    // CRED_IDENTIFIER_TYPE_AGENT
+    size_t separator_index = username.find_first_of(" ._");
+    std::string first = username.substr(0, separator_index);
+    std::string last;
+    if (separator_index != username.npos)
+    {
+        last = username.substr(separator_index + 1, username.npos);
+        LLStringUtil::trim(last);
+    }
+    else
+    {
+        // ...on Linden grids, single username users as considered to have
+        // last name "Resident"
+        // *TODO: Make login.cgi support "account_name" like above
+        last = "resident";
+    }
+
+    key = first + "_" + last;
+    return key;
+}
+
 class LLLoginLocationAutoHandler : public LLCommandHandler
 {
 public:
@@ -168,6 +222,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	mCallback(callback),
 	mCallbackData(cb_data),
 	mListener(new LLPanelLoginListener(this)),
+	mFirstLoginThisInstall(gSavedSettings.getBOOL("FirstLoginThisInstall")),
 	mUsernameLength(0),
 	mPasswordLength(0),
 	mLocationLength(0),
@@ -186,7 +241,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 		login_holder->addChild(this);
 	}
 
-	if (gSavedSettings.getBOOL("FirstLoginThisInstall"))
+	if (mFirstLoginThisInstall)
 	{
 		buildFromFile( "panel_login_first.xml");
 	}
@@ -206,35 +261,39 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	sendChildToBack(getChildView("forgot_password_text"));
 	sendChildToBack(getChildView("sign_up_text"));
 
-	LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo");
-	updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
-	favorites_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
-	favorites_combo->setFocusLostCallback(boost::bind(&LLPanelLogin::onLocationSLURL, this));
-	
-	LLComboBox* server_choice_combo = getChild<LLComboBox>("server_combo");
-	server_choice_combo->setCommitCallback(boost::bind(&LLPanelLogin::onSelectServer, this));
-	
-	// Load all of the grids, sorted, and then add a bar and the current grid at the top
-	server_choice_combo->removeall();
-
-	std::string current_grid = LLGridManager::getInstance()->getGrid();
-	std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
-	for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin();
-		 grid_choice != known_grids.end();
-		 grid_choice++)
-	{
-		if (!grid_choice->first.empty() && current_grid != grid_choice->first)
-		{
-			LL_DEBUGS("AppInit")<<"adding "<<grid_choice->first<<LL_ENDL;
-			server_choice_combo->add(grid_choice->second, grid_choice->first);
-		}
-	}
-	server_choice_combo->sortByName();
-	LL_DEBUGS("AppInit")<<"adding current "<<current_grid<<LL_ENDL;
-	server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(), 
-							 current_grid,
-							 ADD_TOP);	
-	server_choice_combo->selectFirstItem();
+    std::string current_grid = LLGridManager::getInstance()->getGrid();
+    if (!mFirstLoginThisInstall)
+    {
+        LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo");
+        updateLocationSelectorsVisibility(); // separate so that it can be called from preferences
+        favorites_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
+        favorites_combo->setFocusLostCallback(boost::bind(&LLPanelLogin::onLocationSLURL, this));
+
+        LLComboBox* server_choice_combo = getChild<LLComboBox>("server_combo");
+        server_choice_combo->setCommitCallback(boost::bind(&LLPanelLogin::onSelectServer, this));
+
+        // Load all of the grids, sorted, and then add a bar and the current grid at the top
+        server_choice_combo->removeall();
+
+        std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+        for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin();
+            grid_choice != known_grids.end();
+            grid_choice++)
+        {
+            if (!grid_choice->first.empty() && current_grid != grid_choice->first)
+            {
+                LL_DEBUGS("AppInit") << "adding " << grid_choice->first << LL_ENDL;
+                server_choice_combo->add(grid_choice->second, grid_choice->first);
+            }
+        }
+        server_choice_combo->sortByName();
+
+        LL_DEBUGS("AppInit") << "adding current " << current_grid << LL_ENDL;
+        server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(),
+            current_grid,
+            ADD_TOP);
+        server_choice_combo->selectFirstItem();
+    }
 
 	LLSLURL start_slurl(LLStartUp::getStartSLURL());
 	// The StartSLURL might have been set either by an explicit command-line
@@ -297,14 +356,30 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	loadLoginPage();
 
 	LLComboBox* username_combo(getChild<LLComboBox>("username_combo"));
-	username_combo->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
+	username_combo->setTextChangedCallback(boost::bind(&LLPanelLogin::onUserNameTextEnty, this));
 	// STEAM-14: When user presses Enter with this field in focus, initiate login
-	username_combo->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
+	username_combo->setCommitCallback(boost::bind(&LLPanelLogin::onUserListCommit, this));
+	username_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
 	username_combo->setKeystrokeOnEsc(TRUE);
+
+    if (!mFirstLoginThisInstall)
+    {
+        LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
+        remember_name->setCommitCallback(boost::bind(&LLPanelLogin::onRememberUserCheck, this));
+    }
 }
 
 void LLPanelLogin::addFavoritesToStartLocation()
 {
+    if (mFirstLoginThisInstall)
+    {
+        // first login panel has no favorites, just update name length and buttons
+        std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
+        mUsernameLength = user_defined_name.length();
+        updateLoginButtons();
+        return;
+    }
+
 	// Clear the combo.
 	LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
 	if (!combo) return;
@@ -316,14 +391,14 @@ void LLPanelLogin::addFavoritesToStartLocation()
 
 	// Load favorites into the combo.
 	std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
+	LLStringUtil::trim(user_defined_name);
 	LLStringUtil::toLower(user_defined_name);
-	std::replace(user_defined_name.begin(), user_defined_name.end(), '.', ' ');
 	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml");
 	std::string old_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
 	mUsernameLength = user_defined_name.length();
 	updateLoginButtons();
 
-	std::string::size_type index = user_defined_name.find(' ');
+	std::string::size_type index = user_defined_name.find_first_of(" ._");
 	if (index != std::string::npos)
 	{
 		std::string username = user_defined_name.substr(0, index);
@@ -332,6 +407,10 @@ void LLPanelLogin::addFavoritesToStartLocation()
 		{
 			user_defined_name = username;
 		}
+		else
+		{
+			user_defined_name = username + " " + lastname;
+		}
 	}
 
 	LLSD fav_llsd;
@@ -442,24 +521,6 @@ void LLPanelLogin::giveFocus()
 	}
 }
 
-// static
-void LLPanelLogin::showLoginWidgets()
-{
-	if (sInstance)
-	{
-		// *NOTE: Mani - This may or may not be obselete code.
-		// It seems to be part of the defunct? reg-in-client project.
-		sInstance->getChildView("login_widgets")->setVisible( true);
-		LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
-		// *TODO: Append all the usual login parameters, like first_login=Y etc.
-		std::string splash_screen_url = LLGridManager::getInstance()->getLoginPage();
-		web_browser->navigateTo( splash_screen_url, "text/html" );
-		LLUICtrl* username_combo = sInstance->getChild<LLUICtrl>("username_combo");
-		username_combo->setFocus(TRUE);
-	}
-}
-
 // static
 void LLPanelLogin::show(const LLRect &rect,
 						void (*callback)(S32 option, void* user_data),
@@ -480,9 +541,54 @@ void LLPanelLogin::show(const LLRect &rect,
 	gFocusMgr.setDefaultKeyboardFocus(sInstance);
 }
 
+//static
+void LLPanelLogin::populateFields(LLPointer<LLCredential> credential, bool remember_user, bool remember_psswrd)
+{
+    if (!sInstance)
+    {
+        LL_WARNS() << "Attempted fillFields with no login view shown" << LL_ENDL;
+        return;
+    }
+    if (sInstance->mFirstLoginThisInstall)
+    {
+        LLUICtrl* remember_check = sInstance->getChild<LLUICtrl>("remember_check");
+        remember_check->setValue(remember_psswrd);
+        // no list to populate
+        setFields(credential);
+    }
+    else
+    {
+        sInstance->getChild<LLUICtrl>("remember_name")->setValue(remember_user);
+        LLUICtrl* remember_password = sInstance->getChild<LLUICtrl>("remember_password");
+        remember_password->setValue(remember_psswrd);
+        remember_password->setEnabled(remember_user);
+        sInstance->populateUserList(credential);
+    }
+}
+
+//static
+void LLPanelLogin::resetFields()
+{
+    if (!sInstance)
+    {
+        // class not existing at this point might happen since this
+        // function is used to reset list in case of changes by external sources
+        return;
+    }
+    if (sInstance->mFirstLoginThisInstall)
+    {
+        // no list to populate
+        LL_WARNS() << "Shouldn't happen, user should have no ability to modify list on first install" << LL_ENDL;
+    }
+    else
+    {
+        LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+        sInstance->populateUserList(cred);
+    }
+}
+
 // static
-void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
-							 BOOL remember)
+void LLPanelLogin::setFields(LLPointer<LLCredential> credential)
 {
 	if (!sInstance)
 	{
@@ -492,36 +598,43 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
 	sCredentialSet = TRUE;
 	LL_INFOS("Credentials") << "Setting login fields to " << *credential << LL_ENDL;
 
-	LLSD identifier = credential->getIdentifier();
-	if((std::string)identifier["type"] == "agent") 
+	LLSD identifier = credential.notNull() ? credential->getIdentifier() : LLSD();
+
+	if(identifier.has("type") && (std::string)identifier["type"] == "agent") 
 	{
+		// not nessesary for panel_login.xml, needed for panel_login_first.xml
 		std::string firstname = identifier["first_name"].asString();
 		std::string lastname = identifier["last_name"].asString();
 	    std::string login_id = firstname;
-	    if (!lastname.empty() && lastname != "Resident")
+	    if (!lastname.empty() && lastname != "Resident" && lastname != "resident")
 	    {
 		    // support traditional First Last name SLURLs
 		    login_id += " ";
 		    login_id += lastname;
 	    }
-		sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);	
+		sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);
+		sInstance->mUsernameLength = login_id.length();
 	}
-	else if((std::string)identifier["type"] == "account")
+	else if(identifier.has("type") && (std::string)identifier["type"] == "account")
 	{
-		sInstance->getChild<LLComboBox>("username_combo")->setLabel((std::string)identifier["account_name"]);		
+		std::string login_id = identifier["account_name"].asString();
+		sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);
+		sInstance->mUsernameLength = login_id.length();
 	}
 	else
 	{
-	  sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());	
+		sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());
+		sInstance->mUsernameLength = 0;
 	}
+
 	sInstance->addFavoritesToStartLocation();
 	// if the password exists in the credential, set the password field with
 	// a filler to get some stars
-	LLSD authenticator = credential->getAuthenticator();
+	LLSD authenticator = credential.notNull() ? credential->getAuthenticator() : LLSD();
 	LL_INFOS("Credentials") << "Setting authenticator field " << authenticator["type"].asString() << LL_ENDL;
 	if(authenticator.isMap() && 
 	   authenticator.has("secret") && 
-	   (authenticator["secret"].asString().size() > 0) && remember)
+	   (authenticator["secret"].asString().size() > 0))
 	{
 		
 		// This is a MD5 hex digest of a password.
@@ -535,38 +648,28 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
 	}
 	else
 	{
-		sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());		
+		sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());
+		sInstance->mPasswordLength = 0;
 	}
-	sInstance->getChild<LLUICtrl>("remember_check")->setValue(remember);
 }
 
-
 // static
 void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
-							 BOOL& remember)
+							 bool& remember_user,
+							 bool& remember_psswrd)
 {
 	if (!sInstance)
 	{
 		LL_WARNS() << "Attempted getFields with no login view shown" << LL_ENDL;
 		return;
 	}
-	
-	// load the credential so we can pass back the stored password or hash if the user did
-	// not modify the password field.
-	
-	credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
 
 	LLSD identifier = LLSD::emptyMap();
 	LLSD authenticator = LLSD::emptyMap();
-	
-	if(credential.notNull())
-	{
-		authenticator = credential->getAuthenticator();
-	}
 
-	std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
-	LLStringUtil::trim(username);
+	std::string username = sInstance->getChild<LLComboBox>("username_combo")->getSimple();
 	std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
+	LLStringUtil::trim(username);
 
 	LL_INFOS("Credentials", "Authentication") << "retrieving username:" << username << LL_ENDL;
 	// determine if the username is a first/last form or not.
@@ -586,6 +689,14 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
 			authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR;
 			authenticator["secret"] = password;
 		}
+        else
+        {
+            credential = load_user_credentials(username);
+            if (credential.notNull())
+            {
+                authenticator = credential->getAuthenticator();
+            }
+        }
 	}
 	else
 	{
@@ -597,7 +708,7 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
 		if (separator_index != username.npos)
 		{
 			last = username.substr(separator_index+1, username.npos);
-		LLStringUtil::trim(last);
+			LLStringUtil::trim(last);
 		}
 		else
 		{
@@ -625,10 +736,29 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
 				pass.hex_digest(md5pass);
 				authenticator["secret"] = md5pass;
 			}
+            else
+            {
+                std::string key = first + "_" + last;
+                LLStringUtil::toLower(key);
+                credential = load_user_credentials(key);
+                if (credential.notNull())
+                {
+                    authenticator = credential->getAuthenticator();
+                }
+            }
 		}
 	}
 	credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator);
-	remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
+    if (!sInstance->mFirstLoginThisInstall)
+    {
+        remember_psswrd = sInstance->getChild<LLUICtrl>("remember_password")->getValue();
+        remember_user = sInstance->getChild<LLUICtrl>("remember_name")->getValue();
+    }
+    else
+    {
+        remember_psswrd = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
+        remember_user = remember_psswrd; // on panel_login_first "remember_check" is named as 'remember me'
+    }
 }
 
 
@@ -641,11 +771,8 @@ BOOL LLPanelLogin::areCredentialFieldsDirty()
 	}
 	else
 	{
-		std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
-		LLStringUtil::trim(username);
-		std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
 		LLComboBox* combo = sInstance->getChild<LLComboBox>("username_combo");
-		if(combo && combo->isDirty())
+		if (combo && combo->getCurrentIndex() == -1 && !combo->getValue().asString().empty())
 		{
 			return true;
 		}
@@ -898,8 +1025,8 @@ void LLPanelLogin::onClickConnect(void *)
 		{
 			sCredentialSet = FALSE;
 			LLPointer<LLCredential> cred;
-			BOOL remember;
-			getFields(cred, remember);
+			bool remember_1, remember_2;
+			getFields(cred, remember_1, remember_2);
 			std::string identifier_type;
 			cred->identifierType(identifier_type);
 			LLSD allowed_credential_types;
@@ -952,6 +1079,65 @@ void LLPanelLogin::onClickSignUp(void*)
 	}
 }
 
+// static
+void LLPanelLogin::onUserNameTextEnty(void*)
+{
+    sInstance->mPasswordModified = true;
+    sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());
+    sInstance->mPasswordLength = 0;
+    sInstance->addFavoritesToStartLocation(); //will call updateLoginButtons()
+}
+
+// static
+void LLPanelLogin::onUserListCommit(void*)
+{
+    if (sInstance)
+    {
+        LLComboBox* username_combo(sInstance->getChild<LLComboBox>("username_combo"));
+        static S32 ind = -1;
+        if (ind != username_combo->getCurrentIndex())
+        {
+            std::string user_key = username_combo->getSelectedValue();
+            LLPointer<LLCredential> cred = gSecAPIHandler->loadFromCredentialMap("login_list", LLGridManager::getInstance()->getGrid(), user_key);
+            setFields(cred);
+            sInstance->mPasswordModified = false;
+        }
+        else
+        {
+           std::string pass = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
+           if (pass.empty())
+           {
+               sInstance->giveFocus();
+           }
+           else
+           {
+               onClickConnect(NULL);
+           }
+        }
+    }
+}
+
+// static
+// At the moment only happens if !mFirstLoginThisInstall
+void LLPanelLogin::onRememberUserCheck(void*)
+{
+    if (sInstance && !sInstance->mFirstLoginThisInstall)
+    {
+        LLCheckBoxCtrl* remember_name(sInstance->getChild<LLCheckBoxCtrl>("remember_name"));
+        LLCheckBoxCtrl* remember_psswrd(sInstance->getChild<LLCheckBoxCtrl>("remember_password"));
+        LLComboBox* user_combo(sInstance->getChild<LLComboBox>("username_combo"));
+
+        bool remember = remember_name->getValue().asBoolean();
+        if (user_combo->getCurrentIndex() != -1 && !remember)
+        {
+            remember = true;
+            remember_name->setValue(true);
+            LLNotificationsUtil::add("LoginCantRemoveUsername");
+        }
+        remember_psswrd->setEnabled(remember);
+    }
+}
+
 // static
 void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
 {
@@ -976,12 +1162,37 @@ void LLPanelLogin::updateServer()
 		try 
 		{
 			// if they've selected another grid, we should load the credentials
-			// for that grid and set them to the UI.
-			if(!sInstance->areCredentialFieldsDirty())
+			// for that grid and set them to the UI. But if there were any modifications to
+			// fields, modifications should carry over.
+			// Not sure if it should carry over password but it worked like this before login changes
+			// Example: you started typing in and found that your are under wrong grid,
+			// you switch yet don't lose anything
+			if (sInstance->areCredentialFieldsDirty())
 			{
-				LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());	
-				bool remember = sInstance->getChild<LLUICtrl>("remember_check")->getValue();
-				sInstance->setFields(credential, remember);
+				// save modified creds
+				LLComboBox* user_combo = sInstance->getChild<LLComboBox>("username_combo");
+				LLLineEditor* pswd_edit = sInstance->getChild<LLLineEditor>("password_edit");
+				std::string username = user_combo->getSimple();
+				LLStringUtil::trim(username);
+				std::string password = pswd_edit->getValue().asString();
+
+				// populate dropbox and setFields
+				// Note: following call is related to initializeLoginInfo()
+				LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+				sInstance->populateUserList(credential);
+
+				// restore creds
+				user_combo->setTextEntry(username);
+				pswd_edit->setValue(password);
+				sInstance->mUsernameLength = username.length();
+				sInstance->mPasswordLength = password.length();
+			}
+			else
+			{
+				// populate dropbox and setFields
+				// Note: following call is related to initializeLoginInfo()
+				LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+				sInstance->populateUserList(credential);
 			}
 
 			// update the login panel links 
@@ -1011,14 +1222,82 @@ void LLPanelLogin::updateLoginButtons()
 	LLButton* login_btn = getChild<LLButton>("connect_btn");
 
 	login_btn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0);
+
+	if (!mFirstLoginThisInstall)
+	{
+		LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
+		LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
+		if (user_combo->getCurrentIndex() != -1)
+		{
+			remember_name->setValue(true);
+		} // Note: might be good idea to do "else remember_name->setValue(mRememberedState)" but it might behave 'weird' to user
+	}
+}
+
+void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)
+{
+    LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
+    user_combo->removeall();
+    user_combo->clear();
+    mUsernameLength = 0;
+    mPasswordLength = 0;
+
+    if (gSecAPIHandler->hasCredentialMap("login_list", LLGridManager::getInstance()->getGrid()))
+    {
+        LLSecAPIHandler::credential_map_t credencials;
+        gSecAPIHandler->loadCredentialMap("login_list", LLGridManager::getInstance()->getGrid(), credencials);
+
+        LLSecAPIHandler::credential_map_t::iterator cr_iter = credencials.begin();
+        LLSecAPIHandler::credential_map_t::iterator cr_end = credencials.end();
+        while (cr_iter != cr_end)
+        {
+            if (cr_iter->second.notNull()) // basic safety in case of future changes
+            {
+                // cr_iter->first == user_id , to be able to be find it in case we select it
+                user_combo->add(LLPanelLogin::getUserName(cr_iter->second), cr_iter->first, ADD_BOTTOM, TRUE);
+            }
+            cr_iter++;
+        }
+
+        if (credential.isNull() || !user_combo->setSelectedByValue(LLSD(credential->userID()), true))
+        {
+            // selection failed, just deselect whatever might be selected
+            user_combo->setValue(std::string());
+            getChild<LLUICtrl>("password_edit")->setValue(std::string());
+            updateLoginButtons();
+        }
+        else
+        {
+            setFields(credential);
+        }
+    }
+    else
+    {
+        if (credential.notNull())
+        {
+            const LLSD &ident = credential->getIdentifier();
+            if (ident.isMap() && ident.has("type"))
+            {
+                user_combo->add(LLPanelLogin::getUserName(credential), credential->userID(), ADD_BOTTOM, TRUE);
+                setFields(credential);
+            }
+            else
+            {
+                updateLoginButtons();
+            }
+        }
+        else
+        {
+            updateLoginButtons();
+        }
+    }
 }
 
+
 void LLPanelLogin::onSelectServer()
 {
 	// The user twiddled with the grid choice ui.
 	// apply the selection to the grid setting.
-	LLPointer<LLCredential> credential;
-
 	LLComboBox* server_combo = getChild<LLComboBox>("server_combo");
 	LLSD server_combo_val = server_combo->getSelectedValue();
 	LL_INFOS("AppInit") << "grid "<<server_combo_val.asString()<< LL_ENDL;
@@ -1077,3 +1356,34 @@ bool LLPanelLogin::getShowFavorites()
 {
 	return gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin");
 }
+
+// static
+std::string LLPanelLogin::getUserName(LLPointer<LLCredential> &cred)
+{
+    if (cred.isNull())
+    {
+        return "unknown";
+    }
+    const LLSD &ident = cred->getIdentifier();
+
+    if (!ident.isMap())
+    {
+        return "unknown";
+    }
+    else if ((std::string)ident["type"] == "agent")
+    {
+        std::string second_name = ident["last_name"];
+        if (second_name == "resident" || second_name == "Resident")
+        {
+            return (std::string)ident["first_name"];
+        }
+        return (std::string)ident["first_name"] + " " + (std::string)ident["last_name"];
+    }
+    else if ((std::string)ident["type"] == "account")
+    {
+        return LLCacheName::cleanFullName((std::string)ident["account_name"]);
+    }
+
+    return "unknown";
+}
+
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index c633582d89886ea55e669e942d65222079a85fbd..c9b8e1b6fcfdc4bc3ac2344f5eb39e0df7fb9198 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -55,9 +55,9 @@ class LLPanelLogin:
 		void (*callback)(S32 option, void* user_data), 
 		void* callback_data);
 
-	static void setFields(LLPointer<LLCredential> credential, BOOL remember);
-  
-	static void getFields(LLPointer<LLCredential>& credential, BOOL& remember);
+	static void populateFields(LLPointer<LLCredential> credential, bool remember_user, bool remember_psswrd);
+	static void resetFields();
+	static void getFields(LLPointer<LLCredential>& credential, bool& remember_user, bool& remember_psswrd);
 
 	static BOOL isCredentialSet() { return sCredentialSet; }
 
@@ -72,8 +72,6 @@ class LLPanelLogin:
 
 	void setSiteIsAlive( bool alive );
 
-	void showLoginWidgets();
-
 	static void loadLoginPage();	
 	static void giveFocus();
 	static void setAlwaysRefresh(bool refresh); 
@@ -88,6 +86,9 @@ class LLPanelLogin:
 	// called from prefs when initializing panel
 	static bool getShowFavorites();
 
+	// extract name from cred in a format apropriate for username field
+	static std::string getUserName(LLPointer<LLCredential> &cred);
+
 private:
 	friend class LLPanelLoginListener;
 	void addFavoritesToStartLocation();
@@ -95,11 +96,16 @@ class LLPanelLogin:
 	void onSelectServer();
 	void onLocationSLURL();
 
+	static void setFields(LLPointer<LLCredential> credential);
+
 	static void onClickConnect(void*);
 	static void onClickNewAccount(void*);
 	static void onClickVersion(void*);
 	static void onClickForgotPassword(void*);
 	static void onClickSignUp(void*);
+	static void onUserNameTextEnty(void*);
+	static void onUserListCommit(void*);
+	static void onRememberUserCheck(void*);
 	static void onPassKey(LLLineEditor* caller, void* user_data);
 	static void updateServerCombo();
 
@@ -107,6 +113,7 @@ class LLPanelLogin:
 	boost::scoped_ptr<LLPanelLoginListener> mListener;
 
 	void updateLoginButtons();
+	void populateUserList(LLPointer<LLCredential> credential);
 
 	void			(*mCallback)(S32 option, void *userdata);
 	void*			mCallbackData;
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index 2dca55514d2b39f3ed28dc6464a3ce478e7c4e25..b654e928e2effb2ae4cd04f0c10a71d648bab450 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -43,6 +43,7 @@
 #include "llbutton.h"
 #include "lltextbox.h"
 #include "llviewermedia.h"
+#include "llviewerparcelaskplay.h"
 #include "llviewerparcelmedia.h"
 #include "llviewerregion.h"
 #include "llviewermediafocus.h"
@@ -83,10 +84,11 @@ LLPanelNearByMedia::LLPanelNearByMedia()
 {
 	mHoverTimer.stop();
 
-	mParcelAudioAutoStart = gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
-							gSavedSettings.getBOOL("MediaTentativeAutoPlay");
+    // This is just an initial value, mParcelAudioAutoStart does not affect ParcelMediaAutoPlayEnable
+    mParcelAudioAutoStart = gSavedSettings.getS32("ParcelMediaAutoPlayEnable") != 0
+                            && gSavedSettings.getBOOL("MediaTentativeAutoPlay");
 
-	gSavedSettings.getControl(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING)->getSignal()->connect(boost::bind(&LLPanelNearByMedia::handleMediaAutoPlayChanged, this, _2));
+    gSavedSettings.getControl("ParcelMediaAutoPlayEnable")->getSignal()->connect(boost::bind(&LLPanelNearByMedia::handleMediaAutoPlayChanged, this, _2));
 
 	mCommitCallbackRegistrar.add("MediaListCtrl.EnableAll",		boost::bind(&LLPanelNearByMedia::onClickEnableAll, this));
 	mCommitCallbackRegistrar.add("MediaListCtrl.DisableAll",		boost::bind(&LLPanelNearByMedia::onClickDisableAll, this));
@@ -177,9 +179,18 @@ BOOL LLPanelNearByMedia::postBuild()
 
 void LLPanelNearByMedia::handleMediaAutoPlayChanged(const LLSD& newvalue)
 {
-	// update mParcelAudioAutoStart if AUTO_PLAY_MEDIA_SETTING changes
-	mParcelAudioAutoStart = gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
-							gSavedSettings.getBOOL("MediaTentativeAutoPlay");
+	// update mParcelAudioAutoStartMode if "ParcelMediaAutoPlayEnable" changes
+    S32 value = gSavedSettings.getS32("ParcelMediaAutoPlayEnable");
+    mParcelAudioAutoStart = value != 0
+                            && gSavedSettings.getBOOL("MediaTentativeAutoPlay");
+
+    LLViewerParcelAskPlay *inst = LLViewerParcelAskPlay::getInstance();
+    if (value == 2 && !inst->hasData())
+    {
+        // Init if nessesary
+        inst->loadSettings();
+    }
+    inst->cancelNotification();
 }
 
 /*virtual*/
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 6702dae4d6cb73d0e6e0b6d324cce741f0879079..7756b92a3af1c15a0b5d5e1cef85003799cd1e38 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1561,12 +1561,13 @@ void LLPanelObjectInventory::refresh()
 	//LL_INFOS() << "LLPanelObjectInventory::refresh()" << LL_ENDL;
 	BOOL has_inventory = FALSE;
 	const BOOL non_root_ok = TRUE;
-	LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(NULL, non_root_ok);
-	if(node)
+	LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+	LLSelectNode* node = selection->getFirstRootNode(NULL, non_root_ok);
+	if(node && node->mValid)
 	{
 		LLViewerObject* object = node->getObject();
-		if(object && ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1)
-					  || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)))
+		if(object && ((selection->getRootObjectCount() == 1)
+					  || (selection->getObjectCount() == 1)))
 		{
 			// determine if we need to make a request. Start with a
 			// default based on if we have inventory at all.
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 961e2599472ff47caf1c00aef286dbc41f916319..2ef82d0cf907c0702a9370e51eb03498e07a1f99 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -675,6 +675,12 @@ void LLPanelPlaces::onShowOnMapButtonClicked()
 		}
 		else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
 		{
+			if (mItem.isNull())
+			{
+				LL_WARNS() << "NULL landmark item" << LL_ENDL;
+				llassert(mItem.notNull());
+				return;
+			}
 			LLLandmark* landmark = gLandmarkList.getAsset(mItem->getAssetUUID());
 			if (!landmark)
 				return;
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 8105beae1b971cf4c81c19dae7142c1d1b3e5571..3c74aed734ccdd7864fa7dc55387b99e48a2d382 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -547,17 +547,17 @@ void LLPanelPrimMediaControls::updateShape()
 			switch (mScrollState) 
 			{
 				case SCROLL_UP:
-					media_impl->scrollWheel(0, -1, MASK_NONE);
+					media_impl->scrollWheel(0, 0, 0, -1, MASK_NONE);
 					break;
 				case SCROLL_DOWN:
-					media_impl->scrollWheel(0, 1, MASK_NONE);
+					media_impl->scrollWheel(0, 0, 0, 1, MASK_NONE);
 					break;
 				case SCROLL_LEFT:
-					media_impl->scrollWheel(1, 0, MASK_NONE);
+					media_impl->scrollWheel(0, 0, 1, 0, MASK_NONE);
 					//				media_impl->handleKeyHere(KEY_LEFT, MASK_NONE);
 					break;
 				case SCROLL_RIGHT:
-					media_impl->scrollWheel(-1, 0, MASK_NONE);
+					media_impl->scrollWheel(0, 0, -1, 0, MASK_NONE);
 					//				media_impl->handleKeyHere(KEY_RIGHT, MASK_NONE);
 					break;
 				case SCROLL_NONE:
@@ -1134,7 +1134,7 @@ void LLPanelPrimMediaControls::onScrollUp(void* user_data)
 	
 	if(impl)
 	{
-		impl->scrollWheel(0, -1, MASK_NONE);
+		impl->scrollWheel(0, 0, 0, -1, MASK_NONE);
 	}
 }
 void LLPanelPrimMediaControls::onScrollUpHeld(void* user_data)
@@ -1151,7 +1151,7 @@ void LLPanelPrimMediaControls::onScrollRight(void* user_data)
 
 	if(impl)
 	{
-		impl->scrollWheel(-1, 0, MASK_NONE);
+		impl->scrollWheel(0, 0, -1, 0, MASK_NONE);
 //		impl->handleKeyHere(KEY_RIGHT, MASK_NONE);
 	}
 }
@@ -1170,7 +1170,7 @@ void LLPanelPrimMediaControls::onScrollLeft(void* user_data)
 
 	if(impl)
 	{
-		impl->scrollWheel(1, 0, MASK_NONE);
+		impl->scrollWheel(0, 0, 1, 0, MASK_NONE);
 //		impl->handleKeyHere(KEY_LEFT, MASK_NONE);
 	}
 }
@@ -1189,7 +1189,7 @@ void LLPanelPrimMediaControls::onScrollDown(void* user_data)
 	
 	if(impl)
 	{
-		impl->scrollWheel(0, 1, MASK_NONE);
+		impl->scrollWheel(0, 0, 0, 1, MASK_NONE);
 	}
 }
 void LLPanelPrimMediaControls::onScrollDownHeld(void* user_data)
diff --git a/indra/newview/llpanelvolumepulldown.cpp b/indra/newview/llpanelvolumepulldown.cpp
index 6792137350bd01292537f6c33238a3a74830ad2d..f063d8427283b670a1f732f8691b9947e3040de3 100644
--- a/indra/newview/llpanelvolumepulldown.cpp
+++ b/indra/newview/llpanelvolumepulldown.cpp
@@ -140,7 +140,7 @@ void LLPanelVolumePulldown::updateMediaAutoPlayCheckbox(LLUICtrl* ctrl)
 		bool music_enabled = getChild<LLCheckBoxCtrl>("enable_music")->get();
 		bool media_enabled = getChild<LLCheckBoxCtrl>("enable_media")->get();
 
-		getChild<LLCheckBoxCtrl>("media_auto_play_btn")->setEnabled(music_enabled || media_enabled);
+		getChild<LLCheckBoxCtrl>("media_auto_play_combo")->setEnabled(music_enabled || media_enabled);
 	}
 }
 
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index d207f3b5b78a5d072696eb58197eb8d7928c3cea..69b6b32923505fd7aaee0774e0e5b6fc07f9e584 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -464,7 +464,19 @@ class LLSecAPIHandler : public LLThreadSafeRefCount
 	// delete a protected data item from the store
 	virtual void deleteProtectedData(const std::string& data_type,
 									 const std::string& data_id)=0;
-	
+
+	// persist data in a protected store's map
+	virtual void addToProtectedMap(const std::string& data_type,
+								   const std::string& data_id,
+								   const std::string& map_elem,
+								   const LLSD& data)=0;
+
+	// remove data from protected store's map
+	virtual void removeFromProtectedMap(const std::string& data_type,
+										const std::string& data_id,
+										const std::string& map_elem)=0;
+
+public:
 	virtual LLPointer<LLCredential> createCredential(const std::string& grid,
 													 const LLSD& identifier, 
 													 const LLSD& authenticator)=0;
@@ -474,6 +486,42 @@ class LLSecAPIHandler : public LLThreadSafeRefCount
 	virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator)=0;
 	
 	virtual void deleteCredential(LLPointer<LLCredential> cred)=0;
+
+	// has map of credentials declared as specific storage
+	virtual bool hasCredentialMap(const std::string& storage,
+								  const std::string& grid)=0;
+
+	// returns true if map is empty or does not exist
+	virtual bool emptyCredentialMap(const std::string& storage,
+									const std::string& grid)=0;
+
+	// load map of credentials from specific storage
+	typedef std::map<std::string, LLPointer<LLCredential> > credential_map_t;
+	virtual void loadCredentialMap(const std::string& storage,
+								   const std::string& grid,
+								   credential_map_t& credential_map)=0;
+
+	// load single username from map of credentials from specific storage
+	virtual LLPointer<LLCredential> loadFromCredentialMap(const std::string& storage,
+														  const std::string& grid,
+														  const std::string& userid)=0;
+
+	// add item to map of credentials from specific storage
+	virtual void addToCredentialMap(const std::string& storage,
+									LLPointer<LLCredential> cred,
+									bool save_authenticator)=0;
+
+	// remove item from map of credentials from specific storage
+	virtual void removeFromCredentialMap(const std::string& storage,
+										 LLPointer<LLCredential> cred)=0;
+
+	// remove item from map of credentials from specific storage
+	virtual void removeFromCredentialMap(const std::string& storage,
+										 const std::string& grid,
+										 const std::string& userid)=0;
+
+	virtual void removeCredentialMap(const std::string& storage,
+									 const std::string& grid)=0;
 	
 };
 
diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index 9ab9e4a1a24b15775d63915375b61533bc904291..55e49100c3538a9bfb9ad2e80cf6d00a63626dcd 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -52,6 +52,7 @@
 #include "llmachineid.h"
 
 
+static const std::string DEFAULT_CREDENTIAL_STORAGE = "credential";
 
 // 128 bits of salt data...
 #define STORE_SALT_SIZE 16 
@@ -1533,6 +1534,38 @@ void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type,
 	mProtectedDataMap[data_type][data_id] = data; 
 }
 
+// persist data in a protected store's map
+void LLSecAPIBasicHandler::addToProtectedMap(const std::string& data_type,
+											 const std::string& data_id,
+											 const std::string& map_elem,
+											 const LLSD& data)
+{
+    if (!mProtectedDataMap.has(data_type) || !mProtectedDataMap[data_type].isMap()) {
+        mProtectedDataMap[data_type] = LLSD::emptyMap();
+    }
+
+    if (!mProtectedDataMap[data_type].has(data_id) || !mProtectedDataMap[data_type][data_id].isMap()) {
+        mProtectedDataMap[data_type][data_id] = LLSD::emptyMap();
+    }
+
+    mProtectedDataMap[data_type][data_id][map_elem] = data;
+}
+
+// remove data from protected store's map
+void LLSecAPIBasicHandler::removeFromProtectedMap(const std::string& data_type,
+												  const std::string& data_id,
+												  const std::string& map_elem)
+{
+    if (mProtectedDataMap.has(data_type) &&
+        mProtectedDataMap[data_type].isMap() &&
+        mProtectedDataMap[data_type].has(data_id) &&
+        mProtectedDataMap[data_type][data_id].isMap() &&
+        mProtectedDataMap[data_type][data_id].has(map_elem))
+    {
+        mProtectedDataMap[data_type][data_id].erase(map_elem);
+    }
+}
+
 //
 // Create a credential object from an identifier and authenticator.  credentials are
 // per grid.
@@ -1545,10 +1578,10 @@ LLPointer<LLCredential> LLSecAPIBasicHandler::createCredential(const std::string
 	return result;
 }
 
-// Load a credential from the credential store, given the grid
+// Load a credential from default credential store, given the grid
 LLPointer<LLCredential> LLSecAPIBasicHandler::loadCredential(const std::string& grid)
 {
-	LLSD credential = getProtectedData("credential", grid);
+	LLSD credential = getProtectedData(DEFAULT_CREDENTIAL_STORAGE, grid);
 	LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(grid);
 	if(credential.isMap() && 
 	   credential.has("identifier"))
@@ -1603,7 +1636,7 @@ void LLSecAPIBasicHandler::saveCredential(LLPointer<LLCredential> cred, bool sav
 		credential["authenticator"] = cred->getAuthenticator();
 	}
 	LL_DEBUGS("SECAPI") << "Saving Credential " << cred->getGrid() << ":" << cred->userID() << " " << save_authenticator << LL_ENDL;
-	setProtectedData("credential", cred->getGrid(), credential);
+	setProtectedData(DEFAULT_CREDENTIAL_STORAGE, cred->getGrid(), credential);
 	//*TODO: If we're saving Agni credentials, should we write the
 	// credentials to the legacy password.dat/etc?
 	_writeProtectedData();
@@ -1613,11 +1646,150 @@ void LLSecAPIBasicHandler::saveCredential(LLPointer<LLCredential> cred, bool sav
 void LLSecAPIBasicHandler::deleteCredential(LLPointer<LLCredential> cred)
 {
 	LLSD undefVal;
-	deleteProtectedData("credential", cred->getGrid());
+	deleteProtectedData(DEFAULT_CREDENTIAL_STORAGE, cred->getGrid());
 	cred->setCredentialData(undefVal, undefVal);
 	_writeProtectedData();
 }
 
+// has map of credentials declared as specific storage
+bool LLSecAPIBasicHandler::hasCredentialMap(const std::string& storage, const std::string& grid)
+{
+    if (storage == DEFAULT_CREDENTIAL_STORAGE)
+    {
+        LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
+    }
+
+    LLSD credential = getProtectedData(storage, grid);
+
+    return credential.isMap();
+}
+
+// returns true if map is empty or does not exist
+bool LLSecAPIBasicHandler::emptyCredentialMap(const std::string& storage, const std::string& grid)
+{
+    if (storage == DEFAULT_CREDENTIAL_STORAGE)
+    {
+        LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
+    }
+
+    LLSD credential = getProtectedData(storage, grid);
+
+    return !credential.isMap() || credential.size() == 0;
+}
+
+// Load map of credentials from specified credential store, given the grid
+void LLSecAPIBasicHandler::loadCredentialMap(const std::string& storage, const std::string& grid, credential_map_t& credential_map)
+{
+    if (storage == DEFAULT_CREDENTIAL_STORAGE)
+    {
+        LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
+    }
+
+    LLSD credential = getProtectedData(storage, grid);
+    if (credential.isMap())
+    {
+        LLSD::map_const_iterator crd_it = credential.beginMap();
+        for (; crd_it != credential.endMap(); crd_it++)
+        {
+            LLSD::String name = crd_it->first;
+            const LLSD &link_map = crd_it->second;
+            LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(grid);
+            if (link_map.has("identifier"))
+            {
+                LLSD identifier = link_map["identifier"];
+                LLSD authenticator;
+                if (link_map.has("authenticator"))
+                {
+                    authenticator = link_map["authenticator"];
+                }
+                result->setCredentialData(identifier, authenticator);
+            }
+            credential_map[name] = result;
+        }
+    }
+}
+
+LLPointer<LLCredential> LLSecAPIBasicHandler::loadFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey)
+{
+    if (storage == DEFAULT_CREDENTIAL_STORAGE)
+    {
+        LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
+    }
+
+    LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(grid);
+
+    LLSD credential = getProtectedData(storage, grid);
+    if (credential.isMap() && credential.has(userkey) && credential[userkey].has("identifier"))
+    {
+        LLSD identifier = credential[userkey]["identifier"];
+        LLSD authenticator;
+        if (credential[userkey].has("authenticator"))
+        {
+            authenticator = credential[userkey]["authenticator"];
+        }
+        result->setCredentialData(identifier, authenticator);
+    }
+
+    return result;
+}
+
+// add item to map of credentials from specific storage
+void LLSecAPIBasicHandler::addToCredentialMap(const std::string& storage, LLPointer<LLCredential> cred, bool save_authenticator)
+{
+    if (storage == DEFAULT_CREDENTIAL_STORAGE)
+    {
+        LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
+    }
+
+    std::string user_id = cred->userID();
+    LLSD credential = LLSD::emptyMap();
+    credential["identifier"] = cred->getIdentifier();
+    if (save_authenticator)
+    {
+        credential["authenticator"] = cred->getAuthenticator();
+    }
+    LL_DEBUGS("SECAPI") << "Saving Credential " << cred->getGrid() << ":" << cred->userID() << " " << save_authenticator << LL_ENDL;
+    addToProtectedMap(storage, cred->getGrid(), user_id, credential);
+
+    _writeProtectedData();
+}
+
+// remove item from map of credentials from specific storage
+void LLSecAPIBasicHandler::removeFromCredentialMap(const std::string& storage, LLPointer<LLCredential> cred)
+{
+    if (storage == DEFAULT_CREDENTIAL_STORAGE)
+    {
+        LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
+    }
+
+    LLSD undefVal;
+    removeFromProtectedMap(storage, cred->getGrid(), cred->userID());
+    cred->setCredentialData(undefVal, undefVal);
+    _writeProtectedData();
+}
+
+// remove item from map of credentials from specific storage
+void LLSecAPIBasicHandler::removeFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey)
+{
+    if (storage == DEFAULT_CREDENTIAL_STORAGE)
+    {
+        LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
+    }
+
+    LLSD undefVal;
+    LLPointer<LLCredential> cred = loadFromCredentialMap(storage, grid, userkey);
+    removeFromProtectedMap(storage, grid, userkey);
+    cred->setCredentialData(undefVal, undefVal);
+    _writeProtectedData();
+}
+
+// remove item from map of credentials from specific storage
+void LLSecAPIBasicHandler::removeCredentialMap(const std::string& storage, const std::string& grid)
+{
+    deleteProtectedData(storage, grid);
+    _writeProtectedData();
+}
+
 // load the legacy hash for agni, and decrypt it given the 
 // mac address
 std::string LLSecAPIBasicHandler::_legacyLoadPassword()
@@ -1656,15 +1828,18 @@ std::string LLSecAPIBasicCredential::userID() const
 	}
 	else if ((std::string)mIdentifier["type"] == "agent")
 	{
-		return  (std::string)mIdentifier["first_name"] + "_" + (std::string)mIdentifier["last_name"];
+		std::string id = (std::string)mIdentifier["first_name"] + "_" + (std::string)mIdentifier["last_name"];
+		LLStringUtil::toLower(id);
+		return id;
 	}
 	else if ((std::string)mIdentifier["type"] == "account")
 	{
-		return (std::string)mIdentifier["account_name"];
+		std::string id = (std::string)mIdentifier["account_name"];
+		LLStringUtil::toLower(id);
+		return id;
 	}
 
 	return "unknown";
-
 }
 
 // return a printable user identifier
diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h
index c35617f564905983659c33b45db4032b71b37635..0bc7f5230f8a69be187ae8b5659efce7eb98209a 100644
--- a/indra/newview/llsechandler_basic.h
+++ b/indra/newview/llsechandler_basic.h
@@ -211,8 +211,9 @@ class LLSecAPIBasicCredential : public LLCredential
 public:
 	LLSecAPIBasicCredential(const std::string& grid) : LLCredential(grid) {} 
 	virtual ~LLSecAPIBasicCredential() {}
-	// return a value representing the user id, (could be guid, name, whatever)
-	virtual std::string userID() const;	
+	// return a value representing the user id, used for server and voice
+	// (could be guid, name in format "name_resident", whatever)
+	virtual std::string userID() const;
 	
 	// printible string identifying the credential.
 	virtual std::string asString() const;
@@ -246,7 +247,10 @@ class LLSecAPIBasicHandler : public LLSecAPIHandler
 	// exists, it'll be loaded.  If not, one will be created (but not
 	// persisted)
 	virtual LLPointer<LLCertificateStore> getCertificateStore(const std::string& store_id);
-	
+
+	// protectedData functions technically should be pretected or private,
+	// they are not because of llsechandler_basic_test imlementation
+
 	// persist data in a protected store
 	virtual void setProtectedData(const std::string& data_type,
 								  const std::string& data_id,
@@ -259,19 +263,68 @@ class LLSecAPIBasicHandler : public LLSecAPIHandler
 	// delete a protected data item from the store
 	virtual void deleteProtectedData(const std::string& data_type,
 									 const std::string& data_id);
-	
+
+	// persist data in a protected store's map
+	virtual void addToProtectedMap(const std::string& data_type,
+								   const std::string& data_id,
+								   const std::string& map_elem,
+								   const LLSD& data);
+
+	// remove data from protected store's map
+	virtual void removeFromProtectedMap(const std::string& data_type,
+										const std::string& data_id,
+										const std::string& map_elem);
+
 	// credential management routines
 	
 	virtual LLPointer<LLCredential> createCredential(const std::string& grid,
 													 const LLSD& identifier, 
 													 const LLSD& authenticator);
-	
+
+	// load single credencial from default storage
 	virtual LLPointer<LLCredential> loadCredential(const std::string& grid);
 
+	// save credencial to default storage
 	virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator);
 	
 	virtual void deleteCredential(LLPointer<LLCredential> cred);
-	
+
+	// has map of credentials declared as specific storage
+	virtual bool hasCredentialMap(const std::string& storage,
+								  const std::string& grid);
+
+	// returns true if map is empty or does not exist
+	virtual bool emptyCredentialMap(const std::string& storage,
+									const std::string& grid);
+
+	// load map of credentials from specific storage
+	virtual void loadCredentialMap(const std::string& storage,
+								   const std::string& grid,
+								   credential_map_t& credential_map);
+
+	// load single username from map of credentials from specific storage
+	virtual LLPointer<LLCredential> loadFromCredentialMap(const std::string& storage,
+														  const std::string& grid,
+														  const std::string& userid);
+
+	// add item to map of credentials from specific storage
+	virtual void addToCredentialMap(const std::string& storage,
+									LLPointer<LLCredential> cred,
+									bool save_authenticator);
+
+	// remove item from map of credentials from specific storage
+	virtual void removeFromCredentialMap(const std::string& storage,
+										 LLPointer<LLCredential> cred);
+
+	// remove item from map of credentials from specific storage
+	virtual void removeFromCredentialMap(const std::string& storage,
+										 const std::string& grid,
+										 const std::string& userid);
+
+	virtual void removeCredentialMap(const std::string& storage,
+									 const std::string& grid);
+
+
 protected:
 	void _readProtectedData();
 	void _writeProtectedData();
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index f849fecaf6a15332fba06bb1d7da522f2fa6ff0a..aee6bcb05e20f16ddb5b3f9b03dd8d69b0431d25 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -5426,7 +5426,7 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
 		}
 		else
 		{
-			if (node->mInventorySerial != inv_serial)
+			if (node->mInventorySerial != inv_serial && node->getObject())
 			{
 				node->getObject()->dirtyInventory();
 			}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index aba659991816dd63a6de8fc1e127169e731c3fe5..684d3bd4218f5ccf70ea163d31a7450b740e9f3a 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -158,6 +158,7 @@
 #include "llviewermessage.h"
 #include "llviewernetwork.h"
 #include "llviewerobjectlist.h"
+#include "llviewerparcelaskplay.h"
 #include "llviewerparcelmedia.h"
 #include "llviewerparcelmgr.h"
 #include "llviewerregion.h"
@@ -236,7 +237,8 @@ LLSLURL LLStartUp::sStartSLURL;
 
 static LLPointer<LLCredential> gUserCredential;
 static std::string gDisplayName;
-static BOOL gRememberPassword = TRUE;     
+static bool gRememberPassword = true;
+static bool gRememberUser = true;
 
 static U64 gFirstSimHandle = 0;
 static LLHost gFirstSim;
@@ -350,13 +352,6 @@ bool idle_startup()
 	gIdleCallbacks.callFunctions();
 	gViewerWindow->updateUI();
 
-	// There is a crash on updateClass, this is an attempt to get more information
-	if (LLMortician::graveyardCount())
-	{
-		std::stringstream log_stream;
-		LLMortician::logClass(log_stream);
-		LL_INFOS() << log_stream.str() << LL_ENDL;
-	}
 	LLMortician::updateClass();
 
 	const std::string delims (" ");
@@ -701,19 +696,23 @@ bool idle_startup()
 		else if (gSavedSettings.getBOOL("AutoLogin"))  
 		{
 			// Log into last account
-			gRememberPassword = TRUE;
-			gSavedSettings.setBOOL("RememberPassword", TRUE);                                                      
+			gRememberPassword = true;
+			gRememberUser = true;
+			gSavedSettings.setBOOL("RememberPassword", TRUE);
+			gSavedSettings.setBOOL("RememberUser", TRUE);
 			show_connect_box = false;    			
 		}
 		else if (gSavedSettings.getLLSD("UserLoginInfo").size() == 3)
 		{
 			// Console provided login&password
 			gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
+			gRememberUser = gSavedSettings.getBOOL("RememberUser");
 			show_connect_box = false;
 		}
 		else 
 		{
 			gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
+			gRememberUser = gSavedSettings.getBOOL("RememberUser");
 			show_connect_box = TRUE;
 		}
 
@@ -781,10 +780,7 @@ bool idle_startup()
 			// Show the login dialog
 			login_show();
 			// connect dialog is already shown, so fill in the names
-			if (gUserCredential.notNull() && !LLPanelLogin::isCredentialSet())
-			{
-				LLPanelLogin::setFields( gUserCredential, gRememberPassword);
-			}
+			LLPanelLogin::populateFields( gUserCredential, gRememberUser, gRememberPassword);
 			LLPanelLogin::giveFocus();
 
 			// MAINT-3231 Show first run dialog only for Desura viewer
@@ -873,7 +869,7 @@ bool idle_startup()
 		{
 			// TODO if not use viewer auth
 			// Load all the name information out of the login view
-			LLPanelLogin::getFields(gUserCredential, gRememberPassword); 
+			LLPanelLogin::getFields(gUserCredential, gRememberUser, gRememberPassword);
 			// end TODO
 	 
 			// HACK: Try to make not jump on login
@@ -885,14 +881,21 @@ bool idle_startup()
 		// STATE_LOGIN_SHOW state if we've gone backwards
 		mLoginStatePastUI = true;
 
-		// save the credentials                                                                                        
-		std::string userid = "unknown";                                                                                
-		if(gUserCredential.notNull())                                                                                  
-		{  
-			userid = gUserCredential->userID();                                                                    
-			gSecAPIHandler->saveCredential(gUserCredential, gRememberPassword);  
-		}
-		gSavedSettings.setBOOL("RememberPassword", gRememberPassword);                                                 
+		// save the credentials
+		std::string userid = "unknown";
+        if (gUserCredential.notNull())
+        {
+            userid = gUserCredential->userID();
+            if (gRememberUser)
+            {
+                gSecAPIHandler->addToCredentialMap("login_list", gUserCredential, gRememberPassword);
+                // Legacy viewers use this method to store user credentials, newer viewers
+                // reuse it to be compatible and to remember last session
+                gSecAPIHandler->saveCredential(gUserCredential, gRememberPassword);
+            }
+        }
+		gSavedSettings.setBOOL("RememberPassword", gRememberPassword);
+		gSavedSettings.setBOOL("RememberUser", gRememberUser);
 		LL_INFOS("AppInit") << "Attempting login as: " << userid << LL_ENDL;                                           
 		gDebugInfo["LoginName"] = userid;                                                                              
          
@@ -1423,6 +1426,10 @@ bool idle_startup()
 		// create a container's instance for start a controlling conversation windows
 		// by the voice's events
 		LLFloaterIMContainer::getInstance();
+		if (gSavedSettings.getS32("ParcelMediaAutoPlayEnable") == 2)
+		{
+			LLViewerParcelAskPlay::getInstance()->loadSettings();
+		}
 
 		// *Note: this is where gWorldMap used to be initialized.
 
@@ -2708,6 +2715,15 @@ std::string& LLStartUp::getInitialOutfitName()
 	return sInitialOutfit;
 }
 
+std::string LLStartUp::getUserId()
+{
+    if (gUserCredential.isNull())
+    {
+        return "";
+    }
+    return gUserCredential->userID();
+}
+
 // Loads a bitmap to display during load
 void init_start_screen(S32 location_id)
 {
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index db372070228cbf6f1f267449e921a32637038e0e..5ce74b8fae71ac84b959d2e8b467e928da13ebdc 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -115,6 +115,7 @@ class LLStartUp
 	static void saveInitialOutfit();
 
 	static std::string& getInitialOutfitName();
+	static std::string getUserId();
 	
 	static bool dispatchURL();
 		// if we have a SLURL or sim string ("Ahern/123/45") that started
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index 941cb410fcab88f227754ed9eccad010a8659af1..f882fd31ee9439196bde7231e95c39b22b83cfa5 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -34,7 +34,6 @@
 #include "llfontgl.h"
 #include "lltextbox.h"
 #include "llbutton.h"
-#include "llcheckboxctrl.h"
 #include "llkeyboard.h"
 #include "llfocusmgr.h"
 #include "lliconctrl.h"
@@ -62,9 +61,8 @@ static const S32 HPAD = 25;
 static const S32 BTN_HPAD = 8;
 
 LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal)
-	  : LLToastPanel(notification),
+	  : LLCheckBoxToastPanel(notification),
 		mDefaultOption( 0 ),
-		mCheck(NULL),
 		mCaution(notification->getPriority() >= NOTIFICATION_PRIORITY_HIGH),
 		mLabel(notification->getName()),
 		mLineEditor(NULL)
@@ -347,20 +345,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 		button_left += button_width + BTN_HPAD;
 	}
 
-	std::string ignore_label;
-
-	if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE)
-	{
-		setCheckBox(LLNotifications::instance().getGlobalString("skipnexttime"), ignore_label);
-	}
-	if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY)
-	{
-		setCheckBox(LLNotifications::instance().getGlobalString("skipnexttimesessiononly"), ignore_label);
-	}
-	else if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)
-	{
-		setCheckBox(LLNotifications::instance().getGlobalString("alwayschoose"), ignore_label);
-	}
+	setCheckBoxes(HPAD, VPAD);
 
 	// *TODO: check necessity of this code
 	//gFloaterView->adjustToFitScreen(this, FALSE);
@@ -380,46 +365,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 			LLTransientFloaterMgr::GLOBAL, this);
 }
 
-bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::string& check_control )
-{
-	mCheck = LLUICtrlFactory::getInstance()->createFromFile<LLCheckBoxCtrl>("alert_check_box.xml", this, LLPanel::child_registry_t::instance());
-
-	if(!mCheck)
-	{
-		return false;
-	}
-
-	const LLFontGL* font =  mCheck->getFont();
-	const S32 LINE_HEIGHT = font->getLineHeight();
-
-	std::vector<std::string> lines;
-	boost::split(lines, check_title, boost::is_any_of("\n"));
-	
-	// Extend dialog for "check next time"
-	S32 max_msg_width = LLToastPanel::getRect().getWidth() - 2 * HPAD;
-	S32 check_width = S32(font->getWidth(lines[0]) + 0.99f) + 16; // use width of the first line
-	max_msg_width = llmax(max_msg_width, check_width);
-	S32 dialog_width = max_msg_width + 2 * HPAD;
-
-	S32 dialog_height = LLToastPanel::getRect().getHeight();
-	dialog_height += LINE_HEIGHT * lines.size();
-	dialog_height += LINE_HEIGHT / 2;
-
-	LLToastPanel::reshape( dialog_width, dialog_height, FALSE );
-
-	S32 msg_x = (LLToastPanel::getRect().getWidth() - max_msg_width) / 2;
-
-	// set check_box's attributes
-	LLRect check_rect;
-	mCheck->setRect(check_rect.setOriginAndSize(msg_x, VPAD+BTN_HEIGHT+LINE_HEIGHT/2, max_msg_width, LINE_HEIGHT*lines.size()));
-	mCheck->setLabel(check_title);
-	mCheck->setCommitCallback(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1));
-	
-	LLToastPanel::addChild(mCheck);
-
-	return true;
-}
-
 void LLToastAlertPanel::setVisible( BOOL visible )
 {
 	// only make the "ding" sound if it's newly visible
@@ -569,16 +514,3 @@ void LLToastAlertPanel::onButtonPressed( const LLSD& data, S32 button )
 
 	mNotification->respond(response); // new notification reponse
 }
-
-void LLToastAlertPanel::onClickIgnore(LLUICtrl* ctrl)
-{
-	// checkbox sometimes means "hide and do the default" and
-	// other times means "warn me again".  Yuck. JC
-	BOOL check = ctrl->getValue().asBoolean();
-	if (mNotification->getForm()->getIgnoreType() == LLNotificationForm::IGNORE_SHOW_AGAIN)
-	{
-		// question was "show again" so invert value to get "ignore"
-		check = !check;
-	}
-	mNotification->setIgnored(check);
-}
diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h
index 15bf11d42c83ecb622b67f7be6932d29bffa935c..9b4e054bf13656618d40d188e50e386bc2e92ffb 100644
--- a/indra/newview/lltoastalertpanel.h
+++ b/indra/newview/lltoastalertpanel.h
@@ -46,7 +46,7 @@ class LLLineEditor;
  */
 
 class LLToastAlertPanel
-	: public LLToastPanel
+	: public LLCheckBoxToastPanel
 {
 	LOG_CLASS(LLToastAlertPanel);
 public:
@@ -61,13 +61,11 @@ class LLToastAlertPanel
 	virtual void	draw();
 	virtual void	setVisible( BOOL visible );
 
-	bool 			setCheckBox( const std::string&, const std::string& );	
 	void			setCaution(BOOL val = TRUE) { mCaution = val; }
 	// If mUnique==TRUE only one copy of this message should exist
 	void			setUnique(BOOL val = TRUE) { mUnique = val; }
 	void			setEditTextArgs(const LLSD& edit_args);
 	
-	void onClickIgnore(LLUICtrl* ctrl);
 	void onButtonPressed(const LLSD& data, S32 button);
 	
 private:
@@ -91,7 +89,6 @@ class LLToastAlertPanel
 	std::vector<ButtonData> mButtonData;
 
 	S32				mDefaultOption;
-	LLCheckBoxCtrl* mCheck;
 	BOOL			mCaution;
 	BOOL			mUnique;
 	LLUIString		mLabel;
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index a2116817a245c69bbb31000b5d5e249773d14339..bccf88128de5e436d1db2de28579ab2d1e54f22a 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -33,6 +33,7 @@
 
 // library includes
 #include "lldbstrings.h"
+#include "llcheckboxctrl.h"
 #include "lllslconstants.h"
 #include "llnotifications.h"
 #include "lluiconstants.h"
@@ -55,7 +56,7 @@ const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL;
 LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal;
 
 LLToastNotifyPanel::LLToastNotifyPanel(const LLNotificationPtr& notification, const LLRect& rect, bool show_images) 
-:	LLToastPanel(notification),
+:	LLCheckBoxToastPanel(notification),
 	LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerReplaceOnCollision>(notification->getID())
 {
 	init(rect, show_images);
@@ -162,6 +163,11 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair
 		{
 			left = (max_width - btn_rect.getWidth()) / 2;
 		}
+		else if (left == 0 && buttons.size() == 2)
+		{
+			// Note: this and "size() == 1" shouldn't be inside the cycle, might be good idea to refactor whole placing process
+			left = (max_width - (btn_rect.getWidth() * 2) - h_pad) / 2;
+		}
 		else if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel
 		{
 			// looks like we need to add button to the next row
@@ -409,7 +415,20 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
 	//.xml file intially makes info panel only follow left/right/top. This is so that when control buttons are added the info panel 
 	//can shift upward making room for the buttons inside mControlPanel. After the buttons are added, the info panel can then be set to follow 'all'.
 	mInfoPanel->setFollowsAll();
-	snapToMessageHeight(mTextBox, LLToastPanel::MAX_TEXT_LENGTH);
+
+    // Add checkbox (one of couple types) if nessesary.
+    setCheckBoxes(HPAD * 2, 0, mInfoPanel);
+    if (mCheck)
+    {
+        mCheck->setFollows(FOLLOWS_BOTTOM | FOLLOWS_LEFT);
+    }
+    // Snap to message, then to checkbox if present
+    snapToMessageHeight(mTextBox, LLToastPanel::MAX_TEXT_LENGTH);
+    if (mCheck)
+    {
+        S32 new_panel_height = mCheck->getRect().getHeight() + getRect().getHeight() + VPAD;
+        reshape(getRect().getWidth(), new_panel_height);
+    }
 
 	// reshape the panel to its previous size
 	if (current_rect.notEmpty())
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index e4a75acfda09ec9cf7294a474b2a8c96af6b4e02..a5a637c6fac9e4de3fa9bb27f159c9b600a28623 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -47,7 +47,7 @@ class LLNotificationForm;
  * @deprecated this class will be removed after all toast panel types are
  *  implemented in separate classes.
  */
-class LLToastNotifyPanel: public LLToastPanel, public LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerReplaceOnCollision>
+class LLToastNotifyPanel: public LLCheckBoxToastPanel, public LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerReplaceOnCollision>
 {
 public:
 	/**
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index 7c624d5b50566518267ef5dd91aa9acf78b615e4..100d5ee71359327311d51073058502fc5ad60373 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -27,6 +27,7 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "lldbstrings.h"
+#include "llcheckboxctrl.h"
 #include "llpanelgenerictip.h"
 #include "llpanelonlinestatus.h"
 #include "llnotifications.h"
@@ -34,6 +35,8 @@
 #include "lltoastpanel.h"
 #include "lltoastscriptquestion.h"
 
+#include <boost/algorithm/string.hpp>
+
 //static
 const S32 LLToastPanel::MIN_PANEL_HEIGHT = 40; // VPAD(4)*2 + ICON_HEIGHT(32)
 // 'magic numbers', consider initializing (512+20) part from xml/notifications
@@ -145,3 +148,108 @@ LLToastPanel* LLToastPanel::buidPanelFromNotification(
 
 	return res;
 }
+
+LLCheckBoxToastPanel::LLCheckBoxToastPanel(const LLNotificationPtr& p_ntf)
+: LLToastPanel(p_ntf),
+mCheck(NULL)
+{
+
+}
+
+void LLCheckBoxToastPanel::setCheckBoxes(const S32 &h_pad, const S32 &v_pad, LLView *parent_view)
+{
+    std::string ignore_label;
+    LLNotificationFormPtr form = mNotification->getForm();
+
+    if (form->getIgnoreType() == LLNotificationForm::IGNORE_CHECKBOX_ONLY)
+    {
+        // Normally text is only used to describe notification in preferences, 
+        // but this one is not displayed in preferences and works on case by case
+        // basis.
+        // Display text if present, display 'always chose' if not.
+        std::string ignore_message = form->getIgnoreMessage();
+        if (ignore_message.empty())
+        {
+            ignore_message = LLNotifications::instance().getGlobalString("alwayschoose");
+        }
+        setCheckBox(ignore_message, ignore_label, boost::bind(&LLCheckBoxToastPanel::onCommitCheckbox, this, _1), h_pad, v_pad, parent_view);
+    }
+    else if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE)
+    {
+        setCheckBox(LLNotifications::instance().getGlobalString("skipnexttime"), ignore_label, boost::bind(&LLCheckBoxToastPanel::onCommitCheckbox, this, _1), h_pad, v_pad, parent_view);
+    }
+    if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE_SESSION_ONLY)
+    {
+        setCheckBox(LLNotifications::instance().getGlobalString("skipnexttimesessiononly"), ignore_label, boost::bind(&LLCheckBoxToastPanel::onCommitCheckbox, this, _1), h_pad, v_pad, parent_view);
+    }
+    else if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)
+    {
+        setCheckBox(LLNotifications::instance().getGlobalString("alwayschoose"), ignore_label, boost::bind(&LLCheckBoxToastPanel::onCommitCheckbox, this, _1), h_pad, v_pad, parent_view);
+    }
+}
+
+bool LLCheckBoxToastPanel::setCheckBox(const std::string& check_title,
+                                       const std::string& check_control,
+                                       const commit_signal_t::slot_type& cb,
+                                       const S32 &h_pad,
+                                       const S32 &v_pad,
+                                       LLView *parent_view)
+{
+    mCheck = LLUICtrlFactory::getInstance()->createFromFile<LLCheckBoxCtrl>("alert_check_box.xml", this, LLPanel::child_registry_t::instance());
+
+    if (!mCheck)
+    {
+        return false;
+    }
+
+    const LLFontGL* font = mCheck->getFont();
+    const S32 LINE_HEIGHT = font->getLineHeight();
+
+    std::vector<std::string> lines;
+    boost::split(lines, check_title, boost::is_any_of("\n"));
+
+    // Extend dialog for "check next time"
+    S32 max_msg_width = LLToastPanel::getRect().getWidth() - 2 * h_pad;
+    S32 check_width = S32(font->getWidth(lines[0]) + 0.99f) + 16; // use width of the first line
+    max_msg_width = llmax(max_msg_width, check_width);
+    S32 dialog_width = max_msg_width + 2 * h_pad;
+
+    S32 dialog_height = LLToastPanel::getRect().getHeight();
+    dialog_height += LINE_HEIGHT * lines.size();
+    dialog_height += LINE_HEIGHT / 2;
+
+    LLToastPanel::reshape(dialog_width, dialog_height, FALSE);
+
+    S32 msg_x = (LLToastPanel::getRect().getWidth() - max_msg_width) / 2;
+
+    // set check_box's attributes
+    LLRect check_rect;
+    // if we are part of the toast, we need to leave space for buttons
+    S32 msg_y = v_pad + (parent_view ? 0 : (BTN_HEIGHT + LINE_HEIGHT / 2));
+    mCheck->setRect(check_rect.setOriginAndSize(msg_x, msg_y, max_msg_width, LINE_HEIGHT*lines.size()));
+    mCheck->setLabel(check_title);
+    mCheck->setCommitCallback(cb);
+
+    if (parent_view)
+    {
+        // assume that width and height autoadjusts to toast
+        parent_view->addChild(mCheck);
+    }
+    else
+    {
+        LLToastPanel::addChild(mCheck);
+    }
+
+    return true;
+}
+
+void LLCheckBoxToastPanel::onCommitCheckbox(LLUICtrl* ctrl)
+{
+    BOOL check = ctrl->getValue().asBoolean();
+    if (mNotification->getForm()->getIgnoreType() == LLNotificationForm::IGNORE_SHOW_AGAIN)
+    {
+        // question was "show again" so invert value to get "ignore"
+        check = !check;
+    }
+    mNotification->setIgnored(check);
+}
diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h
index 6a9b72a5ae56e915417c784991659d80aaac037e..f4c758ade9ef344c3be4d7155ea30fe22277d329 100644
--- a/indra/newview/lltoastpanel.h
+++ b/indra/newview/lltoastpanel.h
@@ -64,4 +64,23 @@ class LLToastPanel : public LLPanel {
 	S32 computeSnappedToMessageHeight(LLTextBase* message, S32 maxLineCount);
 };
 
+class LLCheckBoxCtrl;
+
+// Wrapper with support for 'don't ask again' checkbox
+class LLCheckBoxToastPanel : public LLToastPanel
+{
+public:
+	LLCheckBoxToastPanel(const LLNotificationPtr& p_ntf);
+	virtual ~LLCheckBoxToastPanel() {};
+
+	// set checkboxes acording to defaults from form
+	void			setCheckBoxes(const S32 &h_pad, const S32 &v_pad, LLView *parent_view = NULL);
+	// set single checkbox
+	bool			setCheckBox(const std::string&, const std::string&, const commit_signal_t::slot_type& cb, const S32 &h_pad, const S32 &v_pad, LLView *parent_view = NULL);
+protected:
+	void onCommitCheckbox(LLUICtrl* ctrl);
+
+	LLCheckBoxCtrl* mCheck;
+};
+
 #endif /* LL_TOASTPANEL_H */
diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp
index b5d78f36548ebeb880dee7a62b8dc6bc249b7ef8..c5e31ff8e6bd3d1f6dc6b76cf9c225dd8c01c850 100644
--- a/indra/newview/lltool.cpp
+++ b/indra/newview/lltool.cpp
@@ -115,6 +115,12 @@ BOOL LLTool::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	return FALSE;
 }
 
+BOOL LLTool::handleScrollHWheel(S32 x, S32 y, S32 clicks)
+{
+    // by default, didn't handle it
+    return FALSE;
+}
+
 BOOL LLTool::handleDoubleClick(S32 x,S32 y,MASK mask)
 {
 	// LL_INFOS() << "LLTool::handleDoubleClick" << LL_ENDL;
diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h
index c5bad9d53272635821f71587dfe9764290faeebb..308983afdabfd16d0f108248ddc8c6c23ee38a5c 100644
--- a/indra/newview/lltool.h
+++ b/indra/newview/lltool.h
@@ -57,6 +57,7 @@ class LLTool
 
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks);
+	virtual BOOL	handleScrollHWheel(S32 x, S32 y, S32 clicks);
 	virtual BOOL	handleDoubleClick(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleRightMouseUp(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index f66211ef3462e77525e20680cb19bc616f112489..7d77a8983f7de8b9ec32d22fa838230922ddebf2 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1728,6 +1728,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
 	const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
 	if(gInventory.isObjectDescendentOf(item->getUUID(), outbox_id))
 	{
+		// Legacy
 		return ACCEPT_NO;
 	}
 
@@ -2154,6 +2155,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
 		const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
 		if(gInventory.isObjectDescendentOf(category->getUUID(), outbox_id))
 		{
+			// Legacy
 			return ACCEPT_NO;
 		}
 
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index f6eb290bc34660297224b132b9b6189440e1e294..3fcf193deca2f4688744f41cd14b7798f43e1b39 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -355,7 +355,7 @@ bool LLToolMgr::inBuildMode()
 
 bool LLToolMgr::canAccessMarketplace()
 {
-	return (LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT) || gSavedSettings.getBOOL("InventoryOutboxDisplayBoth");
+	return (LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
 }
 
 void LLToolMgr::toggleMarketplace(const LLSD& sdname)
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 3955d7a72f4be678d37c6c862ae57af89977d49d..aeb8bdc496dd4d3535f83a1165bf4ee310267b27 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -208,6 +208,11 @@ BOOL LLToolPie::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks);
 }
 
+BOOL LLToolPie::handleScrollHWheel(S32 x, S32 y, S32 clicks)
+{
+    return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks);
+}
+
 // True if you selected an object.
 BOOL LLToolPie::handleLeftClickPick()
 {
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 95d155a474a4ea1005df415b3784524794bfb906..fe0acfe47305e6c1cdb7eba830fb8316cc1f547b 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -50,6 +50,7 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 	virtual BOOL		handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL		handleDoubleClick(S32 x, S32 y, MASK mask);
 	virtual BOOL		handleScrollWheel(S32 x, S32 y, S32 clicks);
+	virtual BOOL		handleScrollHWheel(S32 x, S32 y, S32 clicks);
 	virtual BOOL		handleToolTip(S32 x, S32 y, MASK mask);
 
 	virtual void		render();
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 7e0f449d59761e739a18a95dc8d581fb4789c5ae..bbd5251ed234243e70afdc5d8cc49cde096af575 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -68,6 +68,7 @@
 #include "llfloaterexperiencepicker.h"
 #include "llfloaterevent.h"
 #include "llfloaterfonttest.h"
+#include "llfloaterforgetuser.h"
 #include "llfloatergesture.h"
 #include "llfloatergodtools.h"
 #include "llfloatergridstatus.h"
@@ -233,6 +234,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("experience_search", "floater_experience_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperiencePicker>);
 
 	LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>);
+	LLFloaterReg::add("forget_username", "floater_forget_user.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterForgetUser>);
 
 	LLFloaterReg::add("gestures", "floater_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGesture>);
 	LLFloaterReg::add("god_tools", "floater_god_tools.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGodTools>);
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 9d7da115ac8b4afd9b74112b5983facf13602b41..6ff02ffe66b3999b13c011993e35e31f2376b5ee 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1745,7 +1745,7 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLFolderBridge *bridge,
 {
 	std::string type_name = userdata.asString();
 	
-	if (("inbox" == type_name) || ("outbox" == type_name) || ("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
+	if (("inbox" == type_name) || ("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
 	{
 		LLFolderType::EType preferred_type = LLFolderType::lookup(type_name);
 
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 6cfc22a4e596d31141c5527f7f6541c04f8ef5d0..99b54f66d35e0c014b0bde0b9c41087520c21388 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -57,6 +57,7 @@
 #include "llviewercontrol.h"
 #include "llviewermenufile.h" // LLFilePickerThread
 #include "llviewernetwork.h"
+#include "llviewerparcelaskplay.h"
 #include "llviewerparcelmedia.h"
 #include "llviewerparcelmgr.h"
 #include "llviewerregion.h"
@@ -1018,6 +1019,8 @@ void LLViewerMedia::setAllMediaPaused(bool val)
         }
     }
 
+    LLParcel *agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+
     // Also do Parcel Media and Parcel Audio
     if (!val)
     {
@@ -1051,6 +1054,12 @@ void LLViewerMedia::setAllMediaPaused(bool val)
             LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
         }
     }
+
+    // remove play choice for current parcel
+    if (agent_parcel && gAgent.getRegion())
+    {
+        LLViewerParcelAskPlay::getInstance()->resetSetting(gAgent.getRegion()->getRegionID(), agent_parcel->getLocalID());
+    }
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
@@ -2285,14 +2294,14 @@ void LLViewerMediaImpl::mouseDoubleClick(S32 x, S32 y, MASK mask, S32 button)
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-void LLViewerMediaImpl::scrollWheel(S32 x, S32 y, MASK mask)
+void LLViewerMediaImpl::scrollWheel(S32 x, S32 y, S32 scroll_x, S32 scroll_y, MASK mask)
 {
 	scaleMouse(&x, &y);
 	mLastMouseX = x;
 	mLastMouseY = y;
 	if (mMediaSource)
 	{
-		mMediaSource->scrollEvent(x, y, mask);
+		mMediaSource->scrollEvent(x, y, scroll_x, scroll_y, mask);
 	}
 }
 
@@ -3754,7 +3763,7 @@ void LLViewerMediaImpl::setTextureID(LLUUID id)
 bool LLViewerMediaImpl::isAutoPlayable() const
 {
 	return (mMediaAutoPlay &&
-			gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
+			gSavedSettings.getS32("ParcelMediaAutoPlayEnable") != 0 &&
 			gSavedSettings.getBOOL("MediaTentativeAutoPlay"));
 }
 
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 014f9048f0849559f17007dcb8f923f527495f00..9467a138f03733227dcbcf4b401b1d6fb32cbfe4 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -79,7 +79,7 @@ class LLViewerMedia: public LLSingleton<LLViewerMedia>
 
 public:
 	// String to get/set media autoplay in gSavedSettings
-	static const char* AUTO_PLAY_MEDIA_SETTING;
+    static const char* AUTO_PLAY_MEDIA_SETTING;
 	static const char* SHOW_MEDIA_ON_OTHERS_SETTING;
 	static const char* SHOW_MEDIA_WITHIN_PARCEL_SETTING;
 	static const char* SHOW_MEDIA_OUTSIDE_PARCEL_SETTING;
@@ -235,7 +235,7 @@ class LLViewerMediaImpl
 	void mouseMove(const LLVector2& texture_coords, MASK mask);
     void mouseDoubleClick(const LLVector2& texture_coords, MASK mask);
     void mouseDoubleClick(S32 x, S32 y, MASK mask, S32 button = 0);
-	void scrollWheel(S32 x, S32 y, MASK mask);
+	void scrollWheel(S32 x, S32 y, S32 scroll_x, S32 scroll_y, MASK mask);
 	void mouseCapture();
 	
 	void navigateBack();
@@ -320,6 +320,7 @@ class LLViewerMediaImpl
 	/*virtual*/ BOOL	handleMouseDown(S32 x, S32 y, MASK mask) { return FALSE; };
 	/*virtual*/ BOOL	handleHover(S32 x, S32 y, MASK mask) { return FALSE; };
 	/*virtual*/ BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks) { return FALSE; };
+	/*virtual*/ BOOL	handleScrollHWheel(S32 x, S32 y, S32 clicks) { return FALSE; };
 	/*virtual*/ BOOL	handleDoubleClick(S32 x, S32 y, MASK mask) { return FALSE; };
 	/*virtual*/ BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask) { return FALSE; };
 	/*virtual*/ BOOL	handleRightMouseUp(S32 x, S32 y, MASK mask) { return FALSE; };
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index f4a64a8e55c41ded10ad734cfd0df3ca5d8833e2..69ab0a71af459ecc9abe6e44ddd16faac300ddb4 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -377,12 +377,7 @@ BOOL LLViewerMediaFocus::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	LLViewerMediaImpl* media_impl = getFocusedMediaImpl();
 	if(media_impl && media_impl->hasMedia())
 	{
-        // the scrollEvent() API's x and y are not the same as handleScrollWheel's x and y.
-        // The latter is the position of the mouse at the time of the event
-        // The former is the 'scroll amount' in x and y, respectively.
-        // All we have for 'scroll amount' here is 'clicks'.
-		// We're also not passed the keyboard modifier mask, but we can get that from gKeyboard.
-		media_impl->getMediaPlugin()->scrollEvent(0, clicks, gKeyboard->currentMask(TRUE));
+		media_impl->scrollWheel(x, y, 0, clicks, gKeyboard->currentMask(TRUE));
 		retval = TRUE;
 	}
 	return retval;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 8e10500efba0e93b5bc2016ff1cade6f06274009..f859ced3425d0c82e943cf31b8d69f0a73967e93 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -401,23 +401,20 @@ void set_merchant_SLM_menu()
 
 void check_merchant_status(bool force)
 {
-    if (!gSavedSettings.getBOOL("InventoryOutboxDisplayBoth"))
+    if (force)
     {
-        if (force)
-        {
-            // Reset the SLM status: we actually want to check again, that's the point of calling check_merchant_status()
-            LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED);
-        }
-        // Hide SLM related menu item
-        gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(FALSE);
-        
-        // Also disable the toolbar button for Marketplace Listings
-        LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
-		gToolBarView->enableCommand(command->id(), false);
-        
-        // Launch an SLM test connection to get the merchant status
-        LLMarketplaceData::instance().initializeSLM(boost::bind(&set_merchant_SLM_menu));
+        // Reset the SLM status: we actually want to check again, that's the point of calling check_merchant_status()
+        LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED);
     }
+    // Hide SLM related menu item
+    gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(FALSE);
+
+    // Also disable the toolbar button for Marketplace Listings
+    LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
+    gToolBarView->enableCommand(command->id(), false);
+
+    // Launch an SLM test connection to get the merchant status
+    LLMarketplaceData::instance().initializeSLM(boost::bind(&set_merchant_SLM_menu));
 }
 
 void init_menus()
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 17e61d3a0d27538db29b87fe88feaeef9c9977ee..efd8a23a5f706125dfa7ff4ccc8a1cf56463ad1a 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -2982,6 +2982,7 @@ void LLViewerObject::fetchInventoryFromServer()
 	if (!isInventoryPending())
 	{
 		delete mInventory;
+		mInventory = NULL;
 
 		// Results in processTaskInv
 		LLMessageSystem* msg = gMessageSystem;
diff --git a/indra/newview/llviewerparcelaskplay.cpp b/indra/newview/llviewerparcelaskplay.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d4aa783f120a08bc084e5f84ed4929a4ce307626
--- /dev/null
+++ b/indra/newview/llviewerparcelaskplay.cpp
@@ -0,0 +1,301 @@
+/**
+ * @file llviewerparcelaskplay.cpp
+ * @brief stores data about parcel media user wants to auto-play and shows related notifications
+ *
+ * $LicenseInfo:firstyear=2019&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2019, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewerparcelaskplay.h"
+
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llparcel.h"
+#include "llstartup.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llagent.h"
+#include "llsdserialize.h"
+
+#include <boost/lexical_cast.hpp>
+
+
+// class LLViewerParcelAskPlay
+
+LLViewerParcelAskPlay::LLViewerParcelAskPlay() :
+pNotification(NULL)
+{
+}
+
+LLViewerParcelAskPlay::~LLViewerParcelAskPlay()
+{
+
+}
+
+void LLViewerParcelAskPlay::initSingleton()
+{
+
+}
+void LLViewerParcelAskPlay::cleanupSingleton()
+{
+    cancelNotification();
+}
+
+void LLViewerParcelAskPlay::askToPlay(const LLUUID &region_id, const S32 &parcel_id, const std::string &url, ask_callback cb)
+{
+    EAskPlayMode mode = getPlayMode(region_id, parcel_id);
+
+    switch (mode)
+    {
+    case ASK_PLAY_IGNORE:
+        cb(region_id, parcel_id, url, false);
+        break;
+    case ASK_PLAY_PLAY:
+        cb(region_id, parcel_id, url, true);
+        break;
+    case ASK_PLAY_ASK:
+    default:
+        {
+            // create or re-create notification
+            cancelNotification();
+
+            if (LLStartUp::getStartupState() > STATE_PRECACHE)
+            {
+                LLSD args;
+                args["URL"] = url;
+                LLSD payload;
+                payload["url"] = url; // or we can extract it from notification["substitutions"]
+                payload["parcel_id"] = parcel_id;
+                payload["region_id"] = region_id;
+                pNotification = LLNotificationsUtil::add("ParcelPlayingMedia", args, payload, boost::bind(onAskPlayResponse, _1, _2, cb));
+            }
+            else
+            {
+                // workaround: avoid 'new notifications arrived' on startup and just play
+                // (alternative: move to different channel, may be create new one...)
+                cb(region_id, parcel_id, url, true);
+            }
+        }
+    }
+}
+
+void LLViewerParcelAskPlay::cancelNotification()
+{
+    if (pNotification)
+    {
+        if (!pNotification->isCancelled())
+        {
+            // Force a responce
+            // Alternative is to mark notification as unique
+            pNotification->setIgnored(false);
+            LLNotifications::getInstance()->cancel(pNotification);
+        }
+        pNotification = NULL;
+    }
+}
+
+void LLViewerParcelAskPlay::resetCurrentParcelSetting()
+{
+    LLParcel *agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+    if (agent_parcel && gAgent.getRegion())
+    {
+        LLViewerParcelAskPlay::resetSetting(gAgent.getRegion()->getRegionID(), agent_parcel->getLocalID());
+    }
+}
+
+void LLViewerParcelAskPlay::resetSetting(const LLUUID &region_id, const S32 &parcel_id)
+{
+    region_map_t::iterator found = mRegionMap.find(region_id);
+    if (found != mRegionMap.end())
+    {
+        found->second.erase(parcel_id);
+    }
+}
+
+void LLViewerParcelAskPlay::resetSettings()
+{
+    if (LLViewerParcelAskPlay::instanceExists())
+    {
+        LLViewerParcelAskPlay::getInstance()->mRegionMap.clear();
+    }
+    LLFile::remove(getAskPlayFilename());
+}
+
+void LLViewerParcelAskPlay::setSetting(const LLUUID &region_id, const S32 &parcel_id, const LLViewerParcelAskPlay::ParcelData &data)
+{
+    mRegionMap[region_id][parcel_id] = data;
+}
+
+LLViewerParcelAskPlay::ParcelData* LLViewerParcelAskPlay::getSetting(const LLUUID &region_id, const S32 &parcel_id)
+{
+    region_map_t::iterator found = mRegionMap.find(region_id);
+    if (found != mRegionMap.end())
+    {
+        parcel_data_map_t::iterator found_parcel = found->second.find(parcel_id);
+        if (found_parcel != found->second.end())
+        {
+            return &(found_parcel->second);
+        }
+    }
+    return NULL;
+}
+
+LLViewerParcelAskPlay::EAskPlayMode LLViewerParcelAskPlay::getPlayMode(const LLUUID &region_id, const S32 &parcel_id)
+{
+    EAskPlayMode mode = ASK_PLAY_ASK;
+    ParcelData* data = getSetting(region_id, parcel_id);
+    if (data)
+    {
+        mode = data->mMode;
+        // refresh date
+        data->mDate = LLDate::now();
+    }
+    return mode;
+}
+
+void LLViewerParcelAskPlay::setPlayMode(const LLUUID &region_id, const S32 &parcel_id, LLViewerParcelAskPlay::EAskPlayMode mode)
+{
+    ParcelData data;
+    data.mMode = mode;
+    data.mDate = LLDate::now();
+    setSetting(region_id, parcel_id, data);
+}
+
+//static
+void LLViewerParcelAskPlay::onAskPlayResponse(const LLSD& notification, const LLSD& response, ask_callback cb)
+{
+    S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+    LLUUID region_id = notification["payload"]["region_id"];
+    S32 parcel_id = notification["payload"]["parcel_id"];
+    std::string url = notification["payload"]["url"];
+
+    bool play = option == 1;
+
+    cb(region_id, parcel_id, url, play);
+
+    LLViewerParcelAskPlay *inst = getInstance();
+    bool save_choice = inst->pNotification->isIgnored(); // checkbox selected
+    if (save_choice)
+    {
+        EAskPlayMode mode = (play) ? ASK_PLAY_PLAY : ASK_PLAY_IGNORE;
+        inst->setPlayMode(region_id, parcel_id, mode);
+    }
+}
+
+// static
+std::string LLViewerParcelAskPlay::getAskPlayFilename()
+{
+    return gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "media_autoplay.xml");
+}
+
+void LLViewerParcelAskPlay::loadSettings()
+{
+    mRegionMap.clear();
+
+    std::string path = getAskPlayFilename();
+    if (!gDirUtilp->fileExists(path))
+    {
+        return;
+    }
+
+    LLSD autoplay_llsd;
+    llifstream file;
+    file.open(path.c_str());
+    if (!file.is_open())
+    {
+        return;
+    }
+    S32 status = LLSDSerialize::fromXML(autoplay_llsd, file);
+    file.close();
+
+    if (status == LLSDParser::PARSE_FAILURE || !autoplay_llsd.isMap())
+    {
+        return;
+    }
+
+    for (LLSD::map_const_iterator iter_region = autoplay_llsd.beginMap();
+        iter_region != autoplay_llsd.endMap(); ++iter_region)
+    {
+        LLUUID region_id = LLUUID(iter_region->first);
+        mRegionMap[region_id] = parcel_data_map_t();
+
+        const LLSD &parcel_map = iter_region->second;
+
+        if (parcel_map.isMap())
+        {
+            for (LLSD::map_const_iterator iter_parcel = parcel_map.beginMap();
+                iter_parcel != parcel_map.endMap(); ++iter_parcel)
+            {
+                if (!iter_parcel->second.isMap())
+                {
+                    break;
+                }
+                S32 parcel_id = boost::lexical_cast<S32>(iter_parcel->first.c_str());
+                ParcelData data;
+                data.mMode = (EAskPlayMode)(iter_parcel->second["mode"].asInteger());
+                data.mDate = iter_parcel->second["date"].asDate();
+                mRegionMap[region_id][parcel_id] = data;
+            }
+        }
+    }
+}
+
+void LLViewerParcelAskPlay::saveSettings()
+{
+    LLSD write_llsd;
+    std::string key;
+    for (region_map_t::iterator iter_region = mRegionMap.begin();
+        iter_region != mRegionMap.end(); ++iter_region)
+    {
+        if (iter_region->second.empty())
+        {
+            continue;
+        }
+        key = iter_region->first.asString();
+        write_llsd[key] = LLSD();
+        
+        for (parcel_data_map_t::iterator iter_parcel = iter_region->second.begin();
+            iter_parcel != iter_region->second.end(); ++iter_parcel)
+        {
+            if ((iter_parcel->second.mDate.secondsSinceEpoch() + (F64SecondsImplicit)U32Days(30)) > LLTimer::getTotalSeconds())
+            {
+                // write unexpired parcels
+                std::string parcel_id = boost::lexical_cast<std::string>(iter_parcel->first);
+                write_llsd[key][parcel_id] = LLSD();
+                write_llsd[key][parcel_id]["mode"] = (LLSD::Integer)iter_parcel->second.mMode;
+                write_llsd[key][parcel_id]["date"] = iter_parcel->second.mDate;
+            }
+        }
+    }
+    
+    llofstream file;
+    file.open(getAskPlayFilename().c_str());
+    if (file.is_open())
+    {
+        LLSDSerialize::toPrettyXML(write_llsd, file);
+        file.close();
+    }
+}
+
diff --git a/indra/newview/llviewerparcelaskplay.h b/indra/newview/llviewerparcelaskplay.h
new file mode 100644
index 0000000000000000000000000000000000000000..dc711917d29368f1e755d6ecd0594a6833782e31
--- /dev/null
+++ b/indra/newview/llviewerparcelaskplay.h
@@ -0,0 +1,89 @@
+/**
+ * @file llviewerparcelaskplay.h
+ * @brief stores data about parcel media user wants to auto-play and shows related notifications
+ *
+ * $LicenseInfo:firstyear=2019&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2019, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLVIEWERPARCELASKPLAY_H
+#define LLVIEWERPARCELASKPLAY_H
+
+#include "llnotificationptr.h"
+#include "lluuid.h"
+
+class LLViewerParcelAskPlay : public LLSingleton<LLViewerParcelAskPlay>
+{
+    LLSINGLETON(LLViewerParcelAskPlay);
+    ~LLViewerParcelAskPlay();
+    void initSingleton();
+    void cleanupSingleton();
+public:
+    // functor expects functor(region_id, parcel_id, url, play/stop)
+    typedef boost::function<void(const LLUUID&, const S32&, const std::string&, const bool&)> ask_callback;
+    void        askToPlay(const LLUUID &region_id, const S32 &parcel_id, const std::string &url, ask_callback cb);
+    void        cancelNotification();
+
+    void        resetCurrentParcelSetting();
+    void        resetSetting(const LLUUID &region_id, const S32 &parcel_id);
+    static void resetSettings();
+
+    void        loadSettings();
+    void        saveSettings();
+
+    S32         hasData() { return !mRegionMap.empty(); } // subsitution for 'isInitialized'
+
+private:
+    enum EAskPlayMode{
+        ASK_PLAY_IGNORE = 0,
+        ASK_PLAY_PLAY,
+        ASK_PLAY_ASK
+    };
+
+    class ParcelData
+    {
+    public:
+        LLDate mDate;
+        EAskPlayMode mMode;
+    };
+
+    void               setSetting(const LLUUID &region_id, const S32 &parcel_id, const ParcelData &data);
+    ParcelData*        getSetting(const LLUUID &region_id, const S32 &parcel_id);
+    EAskPlayMode       getPlayMode(const LLUUID &region_id, const S32 &parcel_id);
+    void               setPlayMode(const LLUUID &region_id, const S32 &parcel_id, EAskPlayMode);
+
+    static void        onAskPlayResponse(const LLSD& notification, const LLSD& response, ask_callback cb);
+
+    static std::string getAskPlayFilename();
+
+private:
+    // Variables
+
+    typedef std::map<S32, ParcelData> parcel_data_map_t;
+    typedef std::map<LLUUID, parcel_data_map_t> region_map_t;
+    region_map_t mRegionMap;
+
+    // only one notification is supposed to exists and be visible
+    LLNotificationPtr pNotification;
+};
+
+
+#endif // LLVIEWERPARCELASKPLAY_H
diff --git a/indra/newview/llviewerparcelmediaautoplay.cpp b/indra/newview/llviewerparcelmediaautoplay.cpp
index b5a76ccba2a9c2d4fca938e9e417650da45951d0..36c7d436f6abaa131b9a9f1c89d7548ba95cf43e 100644
--- a/indra/newview/llviewerparcelmediaautoplay.cpp
+++ b/indra/newview/llviewerparcelmediaautoplay.cpp
@@ -24,17 +24,20 @@
  * $/LicenseInfo$
  */
 
+
 #include "llviewerprecompiledheaders.h"
+
 #include "llviewerparcelmediaautoplay.h"
-#include "llviewerparcelmedia.h"
+
+#include "llparcel.h"
 #include "llviewercontrol.h"
 #include "llviewermedia.h"
-#include "llviewerregion.h"
-#include "llparcel.h"
+#include "llviewerparcelaskplay.h"
+#include "llviewerparcelmedia.h"
 #include "llviewerparcelmgr.h"
-#include "lluuid.h"
-#include "message.h"
+#include "llviewerregion.h"
 #include "llviewertexturelist.h"         // for texture stats
+#include "message.h"
 #include "llagent.h"
 #include "llmimetypes.h"
 
@@ -122,11 +125,28 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
 				{
 					if (this_parcel)
 					{
-						if (gSavedSettings.getBOOL("ParcelMediaAutoPlayEnable"))
+						static LLCachedControl<S32> autoplay_mode(gSavedSettings, "ParcelMediaAutoPlayEnable");
+
+						switch (autoplay_mode())
 						{
-							// and last but not least, only play when autoplay is enabled
-							LLViewerParcelMedia::getInstance()->play(this_parcel);
-						}
+							case 0:
+								// Disabled
+								break;
+							case 1:
+								// Play, default value for ParcelMediaAutoPlayEnable
+								LLViewerParcelMedia::getInstance()->play(this_parcel);
+								break;
+							case 2:
+							default:
+							{
+								// Ask
+								LLViewerParcelAskPlay::getInstance()->askToPlay(this_region->getRegionID(),
+																				this_parcel->getLocalID(),
+																				this_parcel->getMediaURL(),
+																				onStartMusicResponse);
+								break;
+  							}
+  						}
 					}
 
 					mPlayed = TRUE;
@@ -139,5 +159,18 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
 	return FALSE; // continue ticking forever please.
 }
 
-
+//static
+void LLViewerParcelMediaAutoPlay::onStartMusicResponse(const LLUUID &region_id, const S32 &parcel_id, const std::string &url, const bool &play)
+{
+    if (play)
+    {
+        LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+
+        // make sure we are still there
+        if (parcel->getLocalID() == parcel_id && gAgent.getRegion()->getRegionID() == region_id)
+        {
+            LLViewerParcelMedia::getInstance()->play(parcel);
+        }
+    }
+}
 
diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h
index 33565307f285e2c5ab84d5c79593c18edaccff4c..cf8e9a97e76149346c1ab932bf930a795de9b40d 100644
--- a/indra/newview/llviewerparcelmediaautoplay.h
+++ b/indra/newview/llviewerparcelmediaautoplay.h
@@ -38,6 +38,9 @@ class LLViewerParcelMediaAutoPlay : LLEventTimer, public LLSingleton<LLViewerPar
 	virtual BOOL tick();
 	static void playStarted();
 
+ private:
+	static void onStartMusicResponse(const LLUUID &region_id, const S32 &parcel_id, const std::string &url, const bool &play);
+
  private:
 	S32 mLastParcelID;
 	LLUUID mLastRegionID;
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 6cc88d0c0be698ba7956a4469ed5c94d464b0cd8..d91d0abb991ecb81f4b7e5457a50935f48531287 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -42,6 +42,7 @@
 // Viewer includes
 #include "llagent.h"
 #include "llagentaccess.h"
+#include "llviewerparcelaskplay.h"
 #include "llviewerwindow.h"
 #include "llviewercontrol.h"
 //#include "llfirstuse.h"
@@ -1832,6 +1833,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
                 // Only update stream if parcel changed (recreated) or music is playing (enabled)
                 if (!agent_parcel_update || gSavedSettings.getBOOL("MediaTentativeAutoPlay"))
                 {
+                    LLViewerParcelAskPlay::getInstance()->cancelNotification();
                     std::string music_url_raw = parcel->getMusicURL();
 
                     // Trim off whitespace from front and back
@@ -1843,7 +1845,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
                     {
                         if (music_url.substr(0, 7) == "http://")
                         {
-                            optionally_start_music(music_url);
+                            LLViewerRegion *region = LLWorld::getInstance()->getRegion(msg->getSender());
+                            optionally_start_music(music_url, parcel->mLocalID, region->getRegionID());
                         }
                         else
                         {
@@ -1864,25 +1867,61 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 			else
 			{
 				// Public land has no music
+				LLViewerParcelAskPlay::getInstance()->cancelNotification();
 				LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
 			}
 		}//if gAudiop
 	};
 }
 
-void LLViewerParcelMgr::optionally_start_music(const std::string& music_url)
+//static
+void LLViewerParcelMgr::onStartMusicResponse(const LLUUID &region_id, const S32 &parcel_id, const std::string &url, const bool &play)
 {
-	if (gSavedSettings.getBOOL("AudioStreamingMusic"))
+    if (play)
+    {
+        LL_INFOS("ParcelMgr") << "Starting parcel music " << url << LL_ENDL;
+        LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(url);
+    }
+}
+
+void LLViewerParcelMgr::optionally_start_music(const std::string &music_url, const S32 &local_id, const LLUUID &region_id)
+{
+	static LLCachedControl<bool> streaming_music(gSavedSettings, "AudioStreamingMusic", true);
+	if (streaming_music)
 	{
+		static LLCachedControl<S32> autoplay_mode(gSavedSettings, "ParcelMediaAutoPlayEnable", 1);
+		static LLCachedControl<bool> tentative_autoplay(gSavedSettings, "MediaTentativeAutoPlay", true);
 		// only play music when you enter a new parcel if the UI control for this
 		// was not *explicitly* stopped by the user. (part of SL-4878)
 		LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();
-		if ((nearby_media_panel &&
-		     nearby_media_panel->getParcelAudioAutoStart()) ||
-		    // or they have expressed no opinion in the UI, but have autoplay on...
-		    (!nearby_media_panel &&
-		     gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
-			 gSavedSettings.getBOOL("MediaTentativeAutoPlay")))
+
+        // ask mode //todo constants
+        if (autoplay_mode == 2)
+        {
+            // stop previous stream
+            LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
+
+            // if user set media to play - ask
+            if ((nearby_media_panel && nearby_media_panel->getParcelAudioAutoStart())
+                || (!nearby_media_panel && tentative_autoplay))
+            {
+                LLViewerParcelAskPlay::getInstance()->askToPlay(region_id,
+                    local_id,
+                    music_url,
+                    onStartMusicResponse);
+            }
+            else
+            {
+                LLViewerParcelAskPlay::getInstance()->cancelNotification();
+            }
+        }
+        // autoplay
+        else if ((nearby_media_panel
+                  && nearby_media_panel->getParcelAudioAutoStart())
+                  // or they have expressed no opinion in the UI, but have autoplay on...
+                 || (!nearby_media_panel
+                     && autoplay_mode == 1
+                     && tentative_autoplay))
 		{
 			LL_INFOS("ParcelMgr") << "Starting parcel music " << music_url << LL_ENDL;
 			LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(music_url);
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 29219843c9ef20b3ea5161a9d28dcd65b37882d4..288077fafc8a9624cf25b59446c6d37c108abf53 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -268,7 +268,8 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 	// *NOTE: Taken out 2005-03-21. Phoenix.
 	//void makeLandmarkAtSelection();
 
-	static void optionally_start_music(const std::string& music_url);
+	static void onStartMusicResponse(const LLUUID &region_id, const S32 &parcel_id, const std::string &url, const bool &play);
+	static void optionally_start_music(const std::string &music_url, const S32 &local_id, const LLUUID &region_id);
 
 	static void processParcelOverlay(LLMessageSystem *msg, void **user_data);
 	static void processParcelProperties(LLMessageSystem *msg, void **user_data);
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 15b2ac8acf0d90501259e9b80b715e61afbd8b74..85d87a43af72a1fbbef76519563a0f6e031d6b44 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -359,16 +359,19 @@ void update_statistics()
 	record(LLStatViewer::REBUILD_STACKTIME, last_frame_recording.getSum(*stat_type_t::getInstance("Sort Draw State")));
 	record(LLStatViewer::RENDER_STACKTIME, last_frame_recording.getSum(*stat_type_t::getInstance("Render Geometry")));
 		
-	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(gAgent.getRegion()->getHost());
-	if (cdp)
+	if (gAgent.getRegion() && isAgentAvatarValid())
 	{
-		sample(LLStatViewer::SIM_PING, F64Milliseconds (cdp->getPingDelay()));
-		gAvgSimPing = ((gAvgSimPing * gSimPingCount) + cdp->getPingDelay()) / (gSimPingCount + 1);
-		gSimPingCount++;
-	}
-	else
-	{
-		sample(LLStatViewer::SIM_PING, U32Seconds(10));
+		LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(gAgent.getRegion()->getHost());
+		if (cdp)
+		{
+			sample(LLStatViewer::SIM_PING, F64Milliseconds(cdp->getPingDelay()));
+			gAvgSimPing = ((gAvgSimPing * gSimPingCount) + cdp->getPingDelay()) / (gSimPingCount + 1);
+			gSimPingCount++;
+		}
+		else
+		{
+			sample(LLStatViewer::SIM_PING, U32Seconds(10));
+		}
 	}
 
 	if (LLViewerStats::instance().getRecording().getSum(LLStatViewer::FPS))
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index c214984e1d1b4722b19fdc78a0be3e4c8ee7e572..f4c2e93a454e945fb08a40a033012981e8db0f27 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1587,6 +1587,11 @@ void LLViewerWindow::handleScrollWheel(LLWindow *window,  S32 clicks)
 	handleScrollWheel( clicks );
 }
 
+void LLViewerWindow::handleScrollHWheel(LLWindow *window,  S32 clicks)
+{
+	handleScrollHWheel(clicks);
+}
+
 void LLViewerWindow::handleWindowBlock(LLWindow *window)
 {
 	send_agent_pause();
@@ -3002,6 +3007,49 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
 	return;
 }
 
+void LLViewerWindow::handleScrollHWheel(S32 clicks)
+{
+    LLUI::getInstance()->resetMouseIdleTimer();
+
+    LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
+    if (mouse_captor)
+    {
+        S32 local_x;
+        S32 local_y;
+        mouse_captor->screenPointToLocal(mCurrentMousePoint.mX, mCurrentMousePoint.mY, &local_x, &local_y);
+        mouse_captor->handleScrollHWheel(local_x, local_y, clicks);
+        if (LLView::sDebugMouseHandling)
+        {
+            LL_INFOS() << "Scroll Horizontal Wheel handled by captor " << mouse_captor->getName() << LL_ENDL;
+        }
+        return;
+    }
+
+    LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+    if (top_ctrl)
+    {
+        S32 local_x;
+        S32 local_y;
+        top_ctrl->screenPointToLocal(mCurrentMousePoint.mX, mCurrentMousePoint.mY, &local_x, &local_y);
+        if (top_ctrl->handleScrollHWheel(local_x, local_y, clicks)) return;
+    }
+
+    if (mRootView->handleScrollHWheel(mCurrentMousePoint.mX, mCurrentMousePoint.mY, clicks))
+    {
+        if (LLView::sDebugMouseHandling)
+        {
+            LL_INFOS() << "Scroll Horizontal Wheel" << LLView::sMouseHandlerMessage << LL_ENDL;
+        }
+        return;
+    }
+    else if (LLView::sDebugMouseHandling)
+    {
+        LL_INFOS() << "Scroll Horizontal Wheel not handled by view" << LL_ENDL;
+    }
+
+    return;
+}
+
 void LLViewerWindow::addPopup(LLView* popup)
 {
 	if (mPopupView)
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index d084642fdcd673ce312f9cb9f7e683a9ddcec713..385bbd57e542d9950f417a569663ebd0abbd1081 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -208,6 +208,7 @@ class LLViewerWindow : public LLWindowCallbacks
 	/*virtual*/ void handleMenuSelect(LLWindow *window,  S32 menu_item);
 	/*virtual*/ BOOL handlePaint(LLWindow *window,  S32 x,  S32 y,  S32 width,  S32 height);
 	/*virtual*/ void handleScrollWheel(LLWindow *window,  S32 clicks);
+	/*virtual*/ void handleScrollHWheel(LLWindow *window,  S32 clicks);
 	/*virtual*/ BOOL handleDoubleClick(LLWindow *window,  LLCoordGL pos, MASK mask);
 	/*virtual*/ void handleWindowBlock(LLWindow *window);
 	/*virtual*/ void handleWindowUnblock(LLWindow *window);
@@ -326,6 +327,7 @@ class LLViewerWindow : public LLWindowCallbacks
 	BOOL			handleKey(KEY key, MASK mask);
 	BOOL			handleKeyUp(KEY key, MASK mask);
 	void			handleScrollWheel	(S32 clicks);
+	void			handleScrollHWheel	(S32 clicks);
 
 	// add and remove views from "popup" layer
 	void			addPopup(LLView* popup);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index bc5b3534c717d59fd524c1ffa039f0498be99358..bec33790bd9edc5dc6e51cd6fba7cf408641b662 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -973,7 +973,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 			mDeferredLight.release();
 		}
 
-		F32 scale = RenderShadowResolutionScale;
+		F32 scale = llmax(0.f, RenderShadowResolutionScale);
 
 		if (shadow_detail > 0)
 		{ //allocate 4 sun shadow maps
@@ -8685,10 +8685,24 @@ void LLPipeline::renderDeferredLighting()
 					}
 
 					const LLViewerObject *vobj = drawablep->getVObj();
-					if(vobj && vobj->getAvatar()
-						&& (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList()))
+					if (vobj)
 					{
-						continue;
+						LLVOAvatar *av = vobj->getAvatar();
+						if (av)
+						{
+							if (av->isTooComplex() || av->isInMuteList() || dist_vec(av->getPosition(), LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip)
+							{
+								continue;
+							}
+						}
+						else
+						{
+							const LLViewerObject *root_obj = drawablep->getParent() ? drawablep->getParent()->getVObj() : vobj;
+							if (root_obj && dist_vec(root_obj->getPosition(), LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip)
+							{
+								continue;
+							}
+						}
 					}
 
 					LLVector4a center;
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 7482ec994cbf54da0486b3c434ecc319f32f1134..17340e08585929ca9758b3d307532a37bab13af1 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -143,7 +143,6 @@ with the same filename but different name
   <texture name="Command_MiniCart_Icon"     file_name="toolbar_icons/mini_cart.png"    preload="true" />
   <texture name="Command_MiniMap_Icon"      file_name="toolbar_icons/mini_map.png"     preload="true" />
   <texture name="Command_Move_Icon"         file_name="toolbar_icons/move.png"         preload="true" />
-  <texture name="Command_Outbox_Icon"       file_name="toolbar_icons/outbox.png"       preload="true" />
   <texture name="Command_People_Icon"       file_name="toolbar_icons/people.png"       preload="true" />
   <texture name="Command_Picks_Icon"        file_name="toolbar_icons/picks.png"        preload="true" />
   <texture name="Command_Places_Icon"       file_name="toolbar_icons/places.png"       preload="true" />
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index 4dd64cba2ae0b3f29428270db4d151baa5dec74e..8f55b3297f57ca1c5fceee9c70055fcd761ecb57 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -30,7 +30,7 @@
 	<floater.string name="Always">
 		Immer
 	</floater.string>
-	<tab_container name="landtab" tab_min_width="40" width="489">
+	<tab_container name="landtab" tab_min_width="40">
 		<panel label="ALLGEMEIN" name="land_general_panel">
 			<panel.string name="new users only">
 				Nur neue Benutzer
diff --git a/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml
deleted file mode 100644
index 4070dee84c3796edf11305a87d5490d4193ae7cf..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="HÄNDLER-OUTBOX">
-	<string name="OutboxFolderCount1">
-		1 Ordner
-	</string>
-	<string name="OutboxFolderCountN">
-		[NUM] Ordner
-	</string>
-	<string name="OutboxImporting">
-		Ordner übertragen...
-	</string>
-	<string name="OutboxInitializing">
-		Initialisieren...
-	</string>
-	<panel label="" name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					Laden...
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					Artikel hierher ziehen, um Ordner zu erstellen
-				</text>
-			</panel>
-			<button label="In Marktplatz übertragen" name="outbox_import_btn" tool_tip="In meinen Marktplatz-Laden verschieben"/>
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml
deleted file mode 100644
index 4006022ffcacb6378c8c94ddb5109beca81afdb5..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Legen Sie Artikel hier ab, um sie zum Verkauf in Ihrem Laden vorzubereiten"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index 550a99fe0a5aff8c0e233bddfb4b13a65ba11fd2..51c82c97f88cfc1793d4a1740102fe246b8bcbee 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -13,7 +13,7 @@
 			<item label="Mittel" name="Medium" value="1"/>
 			<item label="Groß" name="Large" value="2"/>
 		</combo_box>
-		<check_box label="Blasen-Chat" name="bubble_text_chat"/>
+		<check_box label="Blasen-Chat" name="bubble_text_chat" left_delta="8"/>
 	</panel>
 	<panel name="im_notification_settings">
 		<text name="friend_ims">
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
index ff0a6614bd9bd5f2cc5bc838c468f08e608c9c61..e0aa9fe4a97ab2fe765ba8405772a537fa44ae35 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -3,10 +3,10 @@
 	<text name="preset_text">
 		(Keine)
 	</text>
-	<text name="QualitySpeed">
+	<text name="QualitySpeed" top_delta="20">
 		Qualität und Geschwindigkeit:
 	</text>
-	<text name="ShadersPrefText">
+	<text name="ShadersPrefText" top_delta="15">
 		Niedrig
 	</text>
 	<text name="ShadersPrefText2">
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 9f853fd960032489b51aa10169fd5cff2818da9b..a143adfa0633dacff99563e04d2ab849941fa685 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1800,7 +1800,7 @@ Only large parcels can be listed in search.
                 Music URL:
             </text>
             <line_editor
-             follows="left|top"
+             follows="left|top|right"
              height="23"
              layout="topleft"
              left="100"
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
index bac3ea86f1fa7a59f7ecb4acea6585e3903f082d..6540f5e3488726c8a77b958d081dd54e10650ebe 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
@@ -28,11 +28,13 @@
      name="scroll_content_panel"
      follows="left|top"
      min_height="300"
+     min_width="300"
      layout="topleft"
      top="0"
      background_visible="false"
      left="0"
-	 height="680">
+     height="1165"
+     width="1015">
     <text
      type="string"
      length="1"
@@ -102,6 +104,14 @@ Textures
      name="hair_alpha"
      top_delta="0"
      width="92" />
+    <texture_picker
+     height="103"
+     label="Hair Tattoo"
+     layout="topleft"
+     left_pad="7"
+     name="hair_tattoo"
+     top_delta="0"
+     width="92" />
 
     <texture_picker
      height="103"
@@ -135,6 +145,14 @@ Textures
      name="head_tattoo"
      top_delta="0"
      width="92" />
+    <texture_picker
+     height="103"
+     label="Head Unv Tattoo"
+     layout="topleft"
+     left_pad="7"
+     name="head_universal_tattoo"
+     top_delta="0"
+     width="92" />
 
     <texture_picker
      height="103"
@@ -160,6 +178,14 @@ Textures
      name="eyes_alpha"
      top_delta="0"
      width="92" />
+    <texture_picker
+     height="103"
+     label="Eyes Tattoo"
+     layout="topleft"
+     left_pad="7"
+     name="eyes_tattoo"
+     top_delta="0"
+     width="92" />
 
     <texture_picker
      height="103"
@@ -225,6 +251,14 @@ Textures
      name="upper_tattoo"
      top_delta="0"
      width="92" />
+    <texture_picker
+     height="103"
+     label="Upper Unv Tattoo"
+     layout="topleft"
+     left_pad="7"
+     name="upper_universal_tattoo"
+     top_delta="0"
+     width="92" />
 
     <texture_picker
      height="103"
@@ -298,6 +332,14 @@ Textures
      name="lower_tattoo"
      top_delta="0"
      width="92" />
+    <texture_picker
+     height="103"
+     label="Lower Unv Tattoo"
+     layout="topleft"
+     left_pad="7"
+     name="lower_universal_tattoo"
+     top_delta="0"
+     width="92" />
 
     <texture_picker
      height="103"
@@ -315,6 +357,99 @@ Textures
      name="skirt"
      top_delta="0"
      width="92" />
+    <texture_picker
+     height="103"
+     label="Skirt Tattoo"
+     layout="topleft"
+     left_pad="7"
+     name="skirt_tattoo"
+     top_delta="0"
+     width="92" />
+
+    <texture_picker
+     height="103"
+     label="Left Arm"
+     layout="topleft"
+     left="10"
+     name="leftarm-baked"
+     top_delta="100"
+     width="92" />
+    <texture_picker
+     height="103"
+     label="Left Arm Tattoo"
+     layout="topleft"
+     left_pad="21"
+     name="leftarm_tattoo"
+     top_delta="0"
+     width="92" />
+
+    <texture_picker
+     height="103"
+     label="Left Leg"
+     layout="topleft"
+     left="10"
+     name="leftleg-baked"
+     top_delta="100"
+     width="92" />
+    <texture_picker
+     height="103"
+     label="Left Leg Tattoo"
+     layout="topleft"
+     left_pad="21"
+     name="leftleg_tattoo"
+     top_delta="0"
+     width="92" />
+
+    <texture_picker
+     height="103"
+     label="AUX 1"
+     layout="topleft"
+     left="10"
+     name="aux1-baked"
+     top_delta="100"
+     width="92" />
+    <texture_picker
+     height="103"
+     label="AUX 1 Tattoo"
+     layout="topleft"
+     left_pad="21"
+     name="aux1_tattoo"
+     top_delta="0"
+     width="92" />
+
+    <texture_picker
+     height="103"
+     label="AUX 2"
+     layout="topleft"
+     left="10"
+     name="aux2-baked"
+     top_delta="100"
+     width="92" />
+    <texture_picker
+     height="103"
+     label="AUX 2 Tattoo"
+     layout="topleft"
+     left_pad="21"
+     name="aux2_tattoo"
+     top_delta="0"
+     width="92" />
+
+    <texture_picker
+     height="103"
+     label="AUX 3"
+     layout="topleft"
+     left="10"
+     name="aux3-baked"
+     top_delta="100"
+     width="92" />
+    <texture_picker
+     height="103"
+     label="AUX 3 Tattoo"
+     layout="topleft"
+     left_pad="21"
+     name="aux3_tattoo"
+     top_delta="0"
+     width="92" />
 </panel>
 </panel>
 </scroll_container>
diff --git a/indra/newview/skins/default/xui/en/floater_forget_user.xml b/indra/newview/skins/default/xui/en/floater_forget_user.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a9ec1b74a3b4d16c951f06d2eef2a4ba6d44eb9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_forget_user.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="258"
+ layout="topleft"
+ name="groups"
+ help_topic="forget_username"
+ title="REMEMBERED USERNAMES"
+ width="280">
+    <scroll_list
+     height="173"
+     layout="topleft"
+     left="12"
+     name="user_list"
+     top="24"
+     width="256">
+        <scroll_list.columns
+         name="user"
+         width="248" />
+    </scroll_list>
+    <button
+     height="20"
+     label="Forget"
+     label_selected="Forget"
+     layout="topleft"
+     left_delta="90"
+     name="forget"
+     top_pad="8"
+     width="80" />
+    <check_box
+     height="20"
+     label="Also delete local data for this username"
+     layout="topleft"
+     left="15"
+     name="delete_data"
+     top_pad="5"
+     width="260"
+     tool_tip="Deletes local files: chat history, last session screenshot, browser cookies, teleport history, toolbar settings, e t c. Some of local files are shared between grids."/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml
deleted file mode 100644
index 7802f65902e5f4452ec1a37112ad5ef0a66ce712..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,156 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<floater
-    positioning="cascading"
-    can_close="true"
-    can_resize="true"
-    height="440"
-    help_topic="floater_merchant_outbox"
-    min_width="300"
-    min_height="200"
-    name="floater_merchant_outbox"
-    save_rect="true"
-    save_visibility="false"
-    reuse_instance="true"
-    title="MERCHANT OUTBOX"
-    width="333">
-  <string name="OutboxFolderCount0"></string>
-  <string name="OutboxFolderCount1">1 folder</string>
-  <string name="OutboxFolderCountN">[NUM] folders</string>
-  <string name="OutboxImporting">Sending folders...</string>
-  <string name="OutboxInitializing">Initializing...</string>
-  <panel
-      name="panel_1"
-      follows="all"
-      layout="topleft"
-      left="0"
-      top="0"
-      label=""
-      height="440"
-      width="333">
-    <panel
-        name="panel_2"
-        follows="all"
-        left="10"
-        bottom="370"
-        width="313"
-        top="0"
-        bg_opaque_color="InventoryBackgroundColor">
-      <panel
-          name="outbox_inventory_placeholder_panel"
-          follows="all"
-          layout="topleft"
-          top="0"
-          left="0"
-          width="308"
-          height="370"
-          bg_opaque_color="InventoryBackgroundColor">
-        <text
-            name="outbox_inventory_placeholder_title"
-            type="string"
-            follows="top|left|right"
-            layout="topleft"
-            top="10"
-            left="0"
-            width="308"
-            height="25"
-            wrap="true"
-            halign="center"
-            font="SansSerifBold">
-          Loading...
-        </text>
-        <text
-            name="outbox_inventory_placeholder_text"
-            type="string"
-            follows="top|left|right"
-            layout="topleft"
-            top="35"
-            left="0"
-            width="308"
-            height="130"
-            wrap="true"
-            halign="left" />
-      </panel>
-    </panel>
-    <panel
-        name="panel_3"
-        follows="bottom|left|right"
-        left="10"
-        bottom="435"
-        width="313"
-        top="370">
-      <panel
-          name="outbox_generic_drag_target"
-          mouse_opaque="false"
-          follows="all"
-          top="5"
-          left="5"
-          width="303"
-          height="25"
-          background_visible="false"
-          bg_alpha_color="EmphasisColor_35"
-          border="true"
-          bevel_style="in"
-          visible="true">
-        <text
-            name="text_1"
-            type="string"
-            follows="all"
-            layout="topleft"
-            top="6"
-            height="20"
-            left="5"
-            width="293"
-            halign="center"
-            font="SansSerifMedium"
-            font_shadow="hard"
-            valign="top">
-          Drag items here to create folders
-        </text>
-      </panel>
-      <text
-          name="outbox_folder_count"
-          type="string"
-          follows="all"
-          layout="topleft"
-          top="40"
-          left="5"
-          width="150"
-          height="20"
-          wrap="true"
-          halign="left"
-          valign="center"
-          font="SansSerif"/>
-      <button
-          label="Send to Marketplace"
-          tool_tip="Push to my Marketplace Storefront"
-          is_toggle="false"
-          name="outbox_import_btn"
-          follows="bottom|right"
-          tab_stop="false"
-          halign="center"
-          top="37"
-          left="160"
-          height="25"
-          width="150"
-          enabled="false" />
-    </panel>
-    <layout_stack name="import_progress_indicator" orientation="vertical" left="0" height="440" top="0" width="333" follows="all" visible="false">
-      <layout_panel />
-      <layout_panel height="24" auto_resize="false">
-        <layout_stack orientation="horizontal" left="0" height="24" top="0" width="333" follows="all">
-          <layout_panel width="0" />
-          <layout_panel width="24" auto_resize="false">
-            <loading_indicator
-                height="24"
-                layout="topleft"
-                left="0"
-                top="0"
-                width="24" />
-          </layout_panel>
-          <layout_panel width="0" />
-        </layout_stack>
-      </layout_panel>
-      <layout_panel />
-    </layout_stack>
-  </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_trash.xml b/indra/newview/skins/default/xui/en/floater_preview_trash.xml
index 9e50e89ac953b556d4c18aaca44e52247be10dea..3fa71e7bfe024c7f44358481d1c42f48ba48d405 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_trash.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_trash.xml
@@ -14,7 +14,7 @@
  reuse_instance="true"
  can_minimize="false">
   <inventory_panel
-      name="inventory_outbox"
+      name="inventory_trash"
       start_folder.name="Trash"
       show_empty_message="false"
       start_folder.type="trash"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 3bab3aea5590149dbf8864e9450166ae38f29749..04b5d808ecb01947993e21fc097eccf693d5c465 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -154,13 +154,16 @@
           <menu_item_call.on_click
            function="Tools.StopAllAnimations" />
         </menu_item_call>
-        <menu_item_call
+        <menu_item_check
          label="Walk / run / fly..."
          name="WalkRunFly">
-          <menu_item_call.on_click
+          <menu_item_check.on_check
+           function="Floater.Visible"
+           parameter="moveview" />
+          <menu_item_check.on_click
            function="Floater.ToggleOrBringToFront"
            parameter="moveview" />
-        </menu_item_call>
+        </menu_item_check>
       </menu>
 
       <menu
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index af9602ea11ef6c8a05dcd64f3332709085c0c6d8..e3776cdc1a4a5b294da06fdd6b2fe512971f3929 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -2180,7 +2180,7 @@ Wrong chunk size in WAV file:
    icon="alertmodal.tga"
    name="SoundFileInvalidTooLong"
    type="alertmodal">
-Audio file is too long (10 second maximum):
+Audio file is too long (30 second maximum):
 [FILE]
   <tag>fail</tag>
   </notification>
@@ -2259,6 +2259,7 @@ Unable to create output file: [FILE]
    icon="alertmodal.tga"
    name="DoNotSupportBulkAnimationUpload"
    type="alertmodal">
+    <unique/>
 [APP_NAME] does not currently support bulk upload of BVH format animation files.
   <tag>fail</tag>
   </notification>
@@ -3440,6 +3441,9 @@ Display settings have been set to recommended levels because of a change to the
    icon="alertmodal.tga"
    name="ErrorMessage"
    type="alertmodal">
+    <unique>
+      <context>ERROR_MESSAGE</context>
+    </unique>
 [ERROR_MESSAGE]
   <tag>fail</tag>
     <usetemplate
@@ -3546,6 +3550,26 @@ If this is your first time using [SECOND_LIFE], you will need to create an accou
      yestext="Create Account..."/>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="LoginCantRemoveUsername"
+   type="alertmodal">
+    <tag>fail</tag>
+Already remembered user can be forgotten from Me &gt; Preferences &gt; Advanced &gt; Remembered Usernames.
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="LoginCantRemoveCurUsername"
+   type="alertmodal">
+    <tag>confirm</tag>
+Forgetting the logged-in user requires you to log out.
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="Confirm and log out"/>
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="LoginPacketNeverReceived"
@@ -3599,6 +3623,18 @@ You can either check your Internet connection and try again in a few minutes or
     </form>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="LoginRemoveMultiGridUserData"
+   type="alertmodal">
+    <tag>confirm</tag>
+Local Data you are deleting is shared between multiple grids, are you sure you want to delete it?
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="Confirm"/>
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="WelcomeChooseSex"
@@ -6052,6 +6088,34 @@ Would you like to turn off Do Not Disturb before completing this transaction?
     </form>
   </notification>
 
+  <notification
+   icon="notify.tga"
+   label="Parcel is Playing Media"
+   name="ParcelPlayingMedia"   
+   persist="false"
+   type="notify">
+This location plays media:
+[URL]
+Would you like to play it?
+    <tag>confirm</tag>
+    <form name="form">
+      <ignore name="ignore"
+       checkbox_only="true"
+       text="Always choose this option for this land."/>
+      <button
+       ignore="Play Media"
+       index="1"
+       name="Yes"
+       text="Play"/>
+      <button
+       default="true"
+       ignore="Ignore Media"
+       index="0"
+       name="No"
+       text="Don't play"/>
+    </form>
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="ConfirmDeleteProtectedCategory"
@@ -6162,6 +6226,20 @@ Are you sure you want to permanently delete the contents of your Lost And Found?
      yestext="Yes"/>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="ConfirmReplaceLink"
+   type="alertmodal">
+You're about to replace '[TYPE]' body part link with the item which doesn't match the type.
+Are you sure you want to proceed?
+    <tag>confirm</tag>
+    <usetemplate
+     ignoretext="Confirm before I replace link"
+     name="okcancelignore"
+     notext="No"
+     yestext="Yes"/>
+  </notification>
+  
   <notification
    icon="alertmodal.tga"
    name="CopySLURL"
diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
index 27c653bc354ae3b8ef83f3ab34e83e88051fa716..d1175a9fe18926a444a102af31cbaa8440efead3 100644
--- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
@@ -32,7 +32,6 @@
      width="308"/>
     <texture_picker
      allow_no_texture="true"
-     border_enabled="true"
      fallback_image="default_land_picture.j2c"
      enabled="false"
      follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
index 3509eaa2851f63c77565e724a185bab1e1a9f31a..e846edf1d4b9f7beaa958c135816d3dc75277f3a 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -144,7 +144,6 @@
          follows="left|top|right"
          height="100"
          width="273"
-         hide_scrollbar="false"
          layout="topleft"
          left="10"
          top_pad="2"
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 7759d4fdb2975cadfc31b9bf6d426da8a54526a9..ade004f9d0f9a1c5cf390cb6bf0960199101411c 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -33,7 +33,7 @@
       auto_resize="false"
       follows="left|right|top"
       name="ui_container"
-      width="1000"
+      width="1011"
       left="0"
       top="0"
       height="172">
@@ -57,19 +57,15 @@
     combo_editor.prevalidate_callback="ascii"
     tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
     name="username_combo"
-    width="232">
+    width="206">
     <combo_box.combo_editor
       text_pad_left="8" 
       bg_image_always_focused="true"/>
-    <combo_box.combo_button
-      visible="false" />
-    <combo_box.drop_down_button
-      visible="false" />
   </combo_box>
   <line_editor
     follows="left|top"
     height="32"
-    left_pad="-11"
+    left_pad="15"
     max_length_chars="16"
     text_pad_left="8"
     name="password_edit"
@@ -119,36 +115,51 @@
     width="120"
     height="32"
   	left_pad="15"
-    bottom_delta="0" />  
+    bottom_delta="0" />
+  <text
+    follows="left|top"
+    font="SansSerifLarge"
+    font.style="BOLD"
+    text_color="EmphasisColor"
+    height="34"
+    name="sign_up_text"
+    left_pad="10"
+    width="200"
+    valign="center">
+    Sign up
+  </text>
   <check_box
-    control_name="RememberPassword"
     follows="left|top"
     font="SansSerifMedium"
     left="185"
-    bottom_delta="21"  	
+    bottom_delta="21"
     height="24"
     label="Remember me"
+    word_wrap="down"
     check_button.bottom="3"
-    name="remember_check"
-    width="145" />
-  <text
+    name="remember_name"
+    tool_tip="Already remembered user can be forgotten from Me &gt; Preferences &gt; Advanced &gt; Remembered Usernames."
+    width="198" />
+  <check_box
+    control_name="RememberPassword"
     follows="left|top"
     font="SansSerifMedium"
     text_color="EmphasisColor"
     height="16"
-    name="forgot_password_text"
-    left="408"    
+    left="408"
     bottom_delta="0"
-    width="200">
-    Forgotten password
-  </text> 
+    label="Remember password"
+    word_wrap="down"
+    check_button.bottom="3"
+    name="remember_password"
+    width="165" />
   <combo_box
     allow_text_entry="false"
     font="SansSerifTiny"
     follows="left|top"
     height="26"
   	left="588"
-  	bottom_delta="10"
+  	bottom_delta="8"
     max_chars="128"
     label="Select grid"    
     layout="topleft"
@@ -159,12 +170,13 @@
     font="SansSerifMedium"
     text_color="EmphasisColor"
     height="16"
-    name="sign_up_text"
+    name="forgot_password_text"
     left="778"
-    bottom_delta="-10"
-    width="200">
-    Sign up
-  </text> 
+    bottom_delta="-8"
+    width="120"
+    halign="center">
+    Password help
+  </text>
   </layout_panel>
   <layout_panel
       height="172"
diff --git a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
deleted file mode 100644
index b2d8bb874b642b845130c0d444aab27ee63f1589..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<inventory_panel
-    name="inventory_outbox"
-    start_folder.name="Outbox"
-    show_empty_message="false"
-    start_folder.type="outbox"
-    follows="all" layout="topleft"
-    top="0" left="0" height="165" width="308"
-    top_pad="0"
-    bg_opaque_color="DkGray2"
-    bg_alpha_color="DkGray2"
-    background_visible="true"
-    border="false"
-    bevel_style="none"
-    show_item_link_overlays="true"
-    tool_tip="Drag and drop items here to prepare them for sale on your storefront"
-    scroll.reserve_scroll_corner="false">
-      <folder folder_arrow_image="Folder_Arrow"
-              folder_indentation="8"
-              item_height="20"
-              item_top_pad="4"
-              selection_image="Rounded_Square"
-              left_pad="5"
-              icon_pad="2"
-              icon_width="16"
-              text_pad="1"
-              text_pad_right="4"
-              arrow_size="12"
-              max_folder_item_overlap="2"/>
-      <item allow_wear="false"/>
-</inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml
index 79d190e1e09a0e6dea7ae3d190080c2dc6cc333e..99c47eb8257efaf0d6f189b4d17a15c0ff01aa11 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -103,7 +103,6 @@
          height="100"
          width="280"
          parse_urls="true"	
-         hide_scrollbar="false"
          layout="topleft"
          left="10"
          top_pad="2"
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
index 43d580844fb9f61d49abd5403c1c31bf47d6e597..4c0cdd321e16f2879d8d90c2ad3919b288813e77 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -32,7 +32,6 @@
      width="308" />
     <texture_picker
      allow_no_texture="true"
-     border_enabled="true"
      fallback_image="default_land_picture.j2c"
      enabled="false"
      follows="left|top"
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 8296438d4c9943267c6606a552a43084ab5d6c35..d0518aa2450ebf9ae95267ca7193a090cf0897f6 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -248,14 +248,27 @@
      top_pad="5"
      width="237"/>
     <button
+     follows="top|left"
+     layout="topleft"
+     label="Remembered Usernames"
+     name="remembered_usernames"
      height="20"
-     label="Default Creation Permissions"
+     left="30"
+     top_pad="16"
+     width="200">
+    <button.commit_callback
+     function="Pref.RememberedUsernames" />
+  </button>
+  <button
+     follows="top|left"
      layout="topleft"
+     label="Default Creation Permissions"
      name="default_creation_permissions"
+     height="20"
      left="30"
-     top_pad = "20"
-     width="250">
-	<button.commit_callback
-	 function="Pref.PermsDefault" />
+     top_pad="16"
+     width="200">
+    <button.commit_callback
+     function="Pref.PermsDefault" />
   </button>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 9e7023d2f2507b123af9137dace39e8516dbaf24..ece6c95080e22da18c5c46f97fb2d33648341f61 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -99,6 +99,7 @@
         label="Bubble Chat"
         layout="topleft"
         top_pad="4"
+        left_delta="0"
         name="bubble_text_chat"
         width="330">
     </check_box>
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 649403184d4c8e04dbecc416cced287473164d34..c2defdd772f33b2f7c1f12e498440dc1fa373504 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -322,17 +322,40 @@
 		name="enable_voice_check"
 		width="110"/>
 	<!-- -->
-	<check_box
-		name="media_auto_play_btn"
-		control_name="ParcelMediaAutoPlayEnable"
-		enabled_control="AudioStreamingMedia"
-		value="true"
-		follows="left|bottom|right"
-		height="15"
-		tool_tip="Check this to let media auto-play if it wants"
-		label="Allow Media to auto-play"
-		top_pad="1"
-		left="25"/>
+    <text
+        follows="left|top"
+        layout="topleft"
+        height="15"
+        left="0"
+        top_pad="3"
+        width="120"
+        halign="right"
+        name="media_autoplay_label">
+         Media auto-play
+    </text>
+    <combo_box
+        control_name="ParcelMediaAutoPlayEnable"
+        enabled_control="AudioStreamingMedia"
+        follows="left|top"
+        layout="topleft"
+        height="23"
+        left_pad="7"
+        top_delta="-4"
+        name="media_auto_play_combo"
+        width="100">
+      <item
+          label="No"
+          name="autoplay_disabled"
+          value="0"/>      
+      <item
+          label="Yes"
+          name="autoplay_enabled"
+          value="1"/>
+      <item
+          label="Ask"
+          name="autoplay_ask"
+          value="2"/>
+    </combo_box>
  	<check_box
 		name="media_show_on_others_btn"
 		control_name="MediaShowOnOthers"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 454616340a3fcc5d309ebec75a58f0c234b695bd..e1aff135a567ff7d9c93fece99a16c23879cc032 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2807,7 +2807,7 @@ If you continue to receive this message, please contact Second Life support for
 	<string name="BuyingCosts">Buying this costs L$ [AMOUNT]</string>
 	<string name="UnknownFileExtension">
 		Unknown file extension .%s
-Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+Expected .wav, .tga, .bmp, .jpg, .jpeg, or .anim
 	</string>
   <string name="MuteObject2">Block</string>
   <string name="MuteAvatar">Block</string>
@@ -4076,7 +4076,6 @@ Try enclosing path to the editor with double quotes.
   <string name="Command_MarketplaceListings_Label">Marketplace</string>
   <string name="Command_MiniMap_Label">Mini-map</string>
   <string name="Command_Move_Label">Walk / run / fly</string>
-  <string name="Command_Outbox_Label">Merchant outbox</string>
   <string name="Command_People_Label">People</string>
   <string name="Command_Picks_Label">Picks</string>
   <string name="Command_Places_Label">Places</string>
@@ -4106,7 +4105,6 @@ Try enclosing path to the editor with double quotes.
   <string name="Command_MarketplaceListings_Tooltip">Sell your creation</string>
   <string name="Command_MiniMap_Tooltip">Show nearby people</string>
   <string name="Command_Move_Tooltip">Moving your avatar</string>
-  <string name="Command_Outbox_Tooltip">Transfer items to your marketplace for sale</string>
   <string name="Command_People_Tooltip">Friends, groups, and nearby people</string>
   <string name="Command_Picks_Tooltip">Places to show as favorites in your profile</string>
   <string name="Command_Places_Tooltip">Places you've saved</string>
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 998d2a8863939958c867e549c0ee778ef52a84a1..57a1b2ec1e466291001489bfa6e70a8f223b04ac 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -362,7 +362,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
 				Foto:
 			</text>
 			<texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
-			<text name="allow_see_label">
+			<text name="allow_see_label" top="170">
 				Los avatares de otras parcelas pueden ver a los avatares de esta parcela y chatear con ellos
 			</text>
 			<check_box label="Ver los avatares" name="SeeAvatarsCheck" tool_tip="Permite que los avatares de otras parcelas vean a los avatares de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos." top="170"/>
@@ -444,7 +444,7 @@ los media:
 			<panel.string name="estate_override">
 				Una o más de esta opciones está configurada a nivel del estado
 			</panel.string>
-			<check_box label="Cualquiera puede visitar (Si no seleccionas esta opción, se crearán líneas de prohibición)" name="public_access"/>
+			<check_box label="Cualquiera puede visitar" name="public_access" tool_tip="Si no seleccionas esta opción, se crearán líneas de prohibición"/>
 			<check_box label="Debe ser mayor de 18 [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Para poder acceder a esta parcela los Residentes deben ser mayores de 18 años. Para más información, consulta [SUPPORT_SITE]."/>
 			<check_box label="Debe haber información archivada sobre el pago [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Para poder acceder a esta parcela los Residentes deben haber aportado información de pago en su cuenta. Para más información, ver [SUPPORT_SITE]."/>
 			<check_box label="Permitir grupo [GROUP] sin restricciones" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
index 2c8848265f481a62e66c56a6e3a34b29c4b5ddc8..dbff3fcf0e6a5935d8a34ff8b4386048268ab102 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -60,7 +60,7 @@ no el objeto.
 	</text>
 	<button label="Comprar ahora" name="buy_btn"/>
 	<button label="Cancelar" name="cancel_btn"/>
-	<text left="5" name="info_cannot_buy" right="-5">
+	<text name="info_cannot_buy" left="150" font="SansSerifBig">
 		No se pudo hacer la compra
 	</text>
 	<button label="Ir a la web" name="error_web"/>
diff --git a/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml
deleted file mode 100644
index b74c5fca5cc420c5925b9a04ce4b9e41000ad046..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="BUZÓN DE SALIDA DE COMERCIANTE">
-	<string name="OutboxFolderCount1">
-		1 carpeta
-	</string>
-	<string name="OutboxFolderCountN">
-		[NUM] carpetas
-	</string>
-	<string name="OutboxImporting">
-		Enviando carpetas...
-	</string>
-	<string name="OutboxInitializing">
-		Inicializando...
-	</string>
-	<panel label="" name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					Cargando...
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					Arrastra aquí artículos para crear carpetas
-				</text>
-			</panel>
-			<button label="Enviar al Mercado" name="outbox_import_btn" tool_tip="Poner en el escaparate de Mi Mercado"/>
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml
deleted file mode 100644
index 9e2f3c3adc41f06c2b82303c2d91bf77f6e5b742..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Arrastra y coloca aquí los objetos que desees preparar para venderlos en tu tienda"/>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
index f7e036efd7471e9685a18085a80bdafe5b933b06..388a5d84d28b9eea7fef894a914f19c401e5697c 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -13,7 +13,7 @@
 			<item label="Medio" name="Medium" value="1"/>
 			<item label="Grande" name="Large" value="2"/>
 		</combo_box>
-		<check_box label="Bocadillos del chat" name="bubble_text_chat"/>
+		<check_box label="Bocadillos del chat" name="bubble_text_chat" left_delta="30"/>
 	</panel>
 	<panel name="im_notification_settings">
 		<text name="friend_ims">
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
index 1b191d3e46b84f1fd6ae8fce7e0b2a093b270cf1..36888850c4e8ec5c475ff1d6eb0de97501bcddd5 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -30,7 +30,7 @@
 		<combo_box.item label="Preguntarme cuando una actualización opcional está disponible para instalar" name="Install_ask"/>
 		<combo_box.item label="Instalar sólo actualizaciones obligatorias" name="Install_manual"/>
 	</combo_box>
-	<check_box label="Admitir candidatos a la versión comercial a la hora de realizar actualizaciones" name="update_willing_to_test"/>
+	<check_box label="Admitir candidatos a la versión comercial a la hora de realizar actualizaciones" name="update_willing_to_test" left_delta="-20"/>
 	<check_box label="Mostrar las notas de la versión después de la actualización" name="update_show_release_notes"/>
 	<text name="Proxy Settings:">
 		Configuración de proxy:
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index 219857eb992633ce94d0be0132733c3a417ae5ff..fb65e71ee1bbf2e6886f0791b21513002c177b7e 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -366,10 +366,10 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
 				Photo :
 			</text>
 			<texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
-			<text name="allow_see_label">
+			<text name="allow_see_label" top="170">
 				Les avatars sur d&apos;autres parcelles peuvent voir et chatter avec les avatars sur cette parcelle.
 			</text>
-			<check_box label="Voir les avatars" name="SeeAvatarsCheck" tool_tip="Permettre aux avatars présents sur d&apos;autres parcelles de voir et chatter avec les avatars présents sur cette parcelle et à vous de les voir et de chatter avec eux."/>
+			<check_box label="Voir les avatars" name="SeeAvatarsCheck" top="170" tool_tip="Permettre aux avatars présents sur d&apos;autres parcelles de voir et chatter avec les avatars présents sur cette parcelle et à vous de les voir et de chatter avec eux."/>
 			<text name="landing_point">
 				Lieu d&apos;arrivée : [LANDING]
 			</text>
@@ -449,7 +449,7 @@ musique :
 			<panel.string name="estate_override">
 				Au moins une de ces options est définie au niveau du domaine.
 			</panel.string>
-			<check_box label="Tout le monde peut rendre visite (Des lignes d&apos;interdiction seront créées si cette case n&apos;est pas cochée)" name="public_access"/>
+			<check_box label="Tout le monde peut rendre visite" tool_tip="Des lignes d&apos;interdiction seront créées si cette case n&apos;est pas cochée" name="public_access"/>
 			<check_box label="Doit avoir plus de 18 ans [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Pour accéder à cette parcelle, les résidents doivent avoir au moins 18 ans. Consultez le [SUPPORT_SITE] pour plus d&apos;informations."/>
 			<check_box label="Les infos de paiement doivent être enregistrées dans le dossier  [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Pour pouvoir accéder à cette parcelle, les résidents doivent avoir enregistré des informations de paiement. Consultez le [SUPPORT_SITE] pour plus d&apos;informations."/>
 			<check_box label="Autoriser le groupe [GROUP] sans restrictions" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index 148a5a35d23b5bd33ca08bf0bf52e651e2f65167..c295172abf03620a3479c30c5a44d37fb821f406 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -60,7 +60,7 @@ le Lindex...
 	</text>
 	<button label="Acheter" name="buy_btn"/>
 	<button label="Annuler" name="cancel_btn"/>
-	<text left="5" name="info_cannot_buy" right="-5" width="200">
+	<text name="info_cannot_buy" left="160" width="200">
 		Achat impossible
 	</text>
 	<button label="Accéder au Web" name="error_web"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml
deleted file mode 100644
index 0f657e9e5b7199d4676b562d9fa81e340159dc0a..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="BOÃŽTE D&apos;ENVOI VENDEUR">
-	<string name="OutboxFolderCount1">
-		1 dossier
-	</string>
-	<string name="OutboxFolderCountN">
-		[NUM] dossiers
-	</string>
-	<string name="OutboxImporting">
-		Envoi de dossiers...
-	</string>
-	<string name="OutboxInitializing">
-		Initialisation...
-	</string>
-	<panel label="" name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					Chargement...
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					Faites glisser des éléments ici pour créer des dossiers
-				</text>
-			</panel>
-			<button label="Envoyer vers la Place du marché" name="outbox_import_btn" tool_tip="Vers ma vitrine de la Place du marché"/>
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml
deleted file mode 100644
index d947dbceb8c9e828eda5a33028203ff3c53ed82a..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Glisser-déposer des articles ici afin de les préparer à la vente sur votre vitrine."/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index 422243445be9d466a12d64b00a1bdd4f1fb74a72..a0f2e0eba7ae70496d6b9d38de1ed4463cc99111 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -13,7 +13,7 @@
 			<item label="Moyenne" name="Medium" value="1"/>
 			<item label="Grande" name="Large" value="2"/>
 		</combo_box>
-		<check_box label="Bulles de chat" name="bubble_text_chat"/>
+		<check_box label="Bulles de chat" name="bubble_text_chat" left_delta="45"/>
 	</panel>
 	<panel name="im_notification_settings">
 		<text name="friend_ims">
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index 0a7837e12212c56c06b326ed19c0e1b9a0222df2..70909b1f7c49b6318dcb4d7c7a0dc078a3d4c1dd 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -367,11 +367,11 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
 				Fotografia:
 			</text>
 			<texture_picker label="" name="snapshot_ctrl" tool_tip="Clicca per scegliere una immagine"/>
-			<text name="allow_see_label">
+			<text name="allow_see_label" top="170">
 				Gli avatar di altri lotti possono vedere gli avatar che si trovano in questo lotto e chattare con loro
 			</text>
-			<check_box label="Vedi avatar" name="SeeAvatarsCheck" tool_tip="Consente ad avatar in altri lotti di vedere e chattare con avatar in questo lotto e viceversa."/>
-			<text name="landing_point">
+			<check_box label="Vedi avatar" top="170" name="SeeAvatarsCheck" tool_tip="Consente ad avatar in altri lotti di vedere e chattare con avatar in questo lotto e viceversa."/>
+			<text name="landing_point" width="225">
 				Punto di atterraggio: [LANDING]
 			</text>
 			<button label="Imposta" label_selected="Imposta" name="Set" tool_tip="Imposta il punto di atterraggio dove arrivano i visitatori. Impostalo nel punto dove si trova il tuo avatar in questo terreno." width="60"/>
@@ -449,7 +449,7 @@ Media:
 			<panel.string name="estate_override">
 				Una o più di queste impostazioni sono già impostate a livello regionale
 			</panel.string>
-			<check_box label="Chiunque può visitare (Se si rimuove la selezione vengono create linee di espulsione)" name="public_access"/>
+			<check_box label="Chiunque può visitare" tool_tip="Se si rimuove la selezione vengono create linee di espulsione" name="public_access"/>
 			<check_box label="È necessario avere più di 18 anni [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Per poter visitare questo lotto i Residenti devono avere almeno 18 anni. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
 			<check_box label="È necessario aver registrato le informazioni di pagamento [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Per poter visitare questo lotto i Residenti devono aver fornito informazioni di pagamento a Linden Lab.  Vedi [SUPPORT_SITE] per maggiori informazioni."/>
 			<check_box label="Consenti gruppo [GRUPPO] senza restrizioni" name="GroupCheck" tool_tip="Imposta il gruppo nel pannello generale."/>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
index 743969f557147272de279dfea872257c402f775e..53a2057455e1c31618cb13c78ab65467133b306a 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
@@ -60,7 +60,7 @@ l&apos;oggetto.
 	</text>
 	<button label="Acquista" name="buy_btn"/>
 	<button label="Annulla" name="cancel_btn"/>
-	<text left="5" name="info_cannot_buy" right="-5">
+	<text name="info_cannot_buy" left="160" font="SansSerifBig">
 		Non in grado di acquistare
 	</text>
 	<button label="Continua sul Web" name="error_web"/>
diff --git a/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml
deleted file mode 100644
index 7a1f7f0a0cf2ada3c48bba00eb22b488290ee881..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="CASELLA IN USCITA DEL RIVENDITORE">
-	<string name="OutboxFolderCount1">
-		1 cartella
-	</string>
-	<string name="OutboxFolderCountN">
-		[NUM] cartelle
-	</string>
-	<string name="OutboxImporting">
-		Invio cartelle...
-	</string>
-	<string name="OutboxInitializing">
-		Inizializzazione...
-	</string>
-	<panel label="" name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					Caricamento in corso...
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					Trascina elementi qui per creare cartelle
-				</text>
-			</panel>
-			<button label="Invia a Marketplace" name="outbox_import_btn" tool_tip="Push su negozio Marketplace"/>
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml
deleted file mode 100644
index af5e05336e50748ceb4f3c1b7f6433c376bce051..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Trascina gli oggetti qui per prepararli per la vendita nel tuo negozio"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml
deleted file mode 100644
index 2edb3c624cbcd7c1793ac07e4e1a53f281d8f4c3..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="マーチャントアウトボックス">
-	<string name="OutboxFolderCount1">
-		1 個のフォルダ
-	</string>
-	<string name="OutboxFolderCountN">
-		[NUM] 個のフォルダ
-	</string>
-	<string name="OutboxImporting">
-		フォルダを送信中...
-	</string>
-	<string name="OutboxInitializing">
-		初期化中...
-	</string>
-	<panel label="" name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					ロード中...
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					ここにアイテムをドラッグして、フォルダを作成する
-				</text>
-			</panel>
-			<button label="マーケットプレイスに送信" name="outbox_import_btn" tool_tip="自分のマーケットプレイス店頭に移動"/>
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml
deleted file mode 100644
index 1a142831134257c67698fb7ed4bb2b2a398389ca..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="アイテムをここにドラッグアンドドロップすると、あなたの店頭に並びます"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/pl/floater_merchant_outbox.xml
deleted file mode 100644
index 9cc88ba288161f596fac36e99a202ebb8dd1d0d5..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/pl/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="SKRZYNKA NADAWCZA KUPCA">
-	<string name="OutboxFolderCountN">
-		Folderów: [NUM]
-	</string>
-	<string name="OutboxImporting">
-		Wysyłanie folderów...
-	</string>
-	<string name="OutboxInitializing">
-		Inicjalizacja...
-	</string>
-	<panel name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					Ładowanie...
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					Przeciągaj tu przedmioty by tworzyć foldery
-				</text>
-			</panel>
-			<button label="Wyślij na Marketplace" tool_tip="Wyślij na witrynę Marketplace" name="outbox_import_btn" />
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/pl/panel_outbox_inventory.xml
deleted file mode 100644
index 01d0455215d462ad44331878130ee103d48f3334..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/pl/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<inventory_panel name="inventory_outbox" tool_tip="Przeciągnij i upuść tutaj przedmioty, aby przygotować je do sprzedaży na Twojej witrynie Marketplace" />
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index ef71baa0b6287fd1c7d52405df5bc701e300ad59..0e7d0798c79d5cbc3119a0b58cbd27a3d0b6c47b 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -362,11 +362,11 @@ Apenas lotes maiores podem ser listados na busca.
 				Foto:
 			</text>
 			<texture_picker label="" name="snapshot_ctrl" tool_tip="Clique para escolher uma imagem"/>
-			<text name="allow_see_label">
+			<text name="allow_see_label" top="170">
 				Avatares em outros lotes podem ver e conversar com avatares neste lote
 			</text>
-			<check_box label="Ver avatares" name="SeeAvatarsCheck" tool_tip="Permite que os avatares em outros lotes vejam e batam papo com avatares neste lote. Você poderá vê-los e conversar com eles."/>
-			<text name="landing_point">
+			<check_box label="Ver avatares" name="SeeAvatarsCheck" top="170" tool_tip="Permite que os avatares em outros lotes vejam e batam papo com avatares neste lote. Você poderá vê-los e conversar com eles."/>
+			<text name="landing_point" width="225">
 				Ponto de Aterrissagem: [LANDING]
 			</text>
 			<button label="Definir" label_selected="Definir" name="Set" tool_tip="Define o ponto de aterrissagem de visitantes. Define para o ponto em que seu avatar se encontra neste lote."/>
diff --git a/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml
deleted file mode 100644
index 3beada1fc01f19b5c750ea71d6afeae861c8c2f4..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="CAIXA DE SAÍDA DO LOJISTA">
-	<string name="OutboxFolderCount1">
-		1 pasta
-	</string>
-	<string name="OutboxFolderCountN">
-		[NUM] pasta(s)
-	</string>
-	<string name="OutboxImporting">
-		Enviando pastas...
-	</string>
-	<string name="OutboxInitializing">
-		Iniciando...
-	</string>
-	<panel label="" name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					Carregando...
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					Arraste itens para cá para criar pastas
-				</text>
-			</panel>
-			<button label="Enviar para Mercado" name="outbox_import_btn" tool_tip="Enviar para a frente da minha loja do mercado"/>
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml
deleted file mode 100644
index 442622035ac8ee0cda0bf66dc7e896ccbda28cb3..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Arraste e solte os itens aqui para prepará-los para venda na frente da sua loja"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml
index 1ae6df76d920663583f23952d2f353236c49d1e4..fb17896551c075dfc6dccbd9b28e68d7815e981b 100644
--- a/indra/newview/skins/default/xui/ru/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml
@@ -338,7 +338,7 @@
 			<check_box label="Все" name="check other scripts" tool_tip="Если установлен флажок, то жители могут выполнять скрипты на вашем участке, включая приложения."/>
 			<check_box label="Группа" name="check group scripts" tool_tip="Если установлен флажок, то члены группы могут выполнять скрипты на вашем участке, включая приложения."/>
 			<check_box label="Безопасно (нет повреждений)" name="check safe" tool_tip="Если отмечено, то земля считается безопасной, отключены боевые повреждения. Если не отмечено, то боевые повреждения включены."/>
-			<check_box label="Не толкать" name="PushRestrictCheck" tool_tip="Запрещает скриптам функцию толкания. Этот параметр может оказаться полезным для предотвращения нежелательного поведения на вашей земле."/>
+			<check_box label="Не толкать" name="PushRestrictCheck" left_pad="44" tool_tip="Запрещает скриптам функцию толкания. Этот параметр может оказаться полезным для предотвращения нежелательного поведения на вашей земле."/>
 			<check_box label="Показать место в поиске (L$30/неделя)" name="ShowDirectoryCheck" tool_tip="Позволить людям видеть участок в результатах поиска"/>
 			<combo_box name="land category">
 				<combo_box.item label="Любая категория" name="item0"/>
@@ -360,11 +360,11 @@
 				Снимок:
 			</text>
 			<texture_picker name="snapshot_ctrl" tool_tip="Щелкните для выбора изображения"/>
-			<text name="allow_see_label">
+			<text name="allow_see_label" left="283">
 				Аватары с других участков могут видеть аватары на этом участке и общаться с ними
 			</text>
-			<check_box label="Видны аватары" name="SeeAvatarsCheck" tool_tip="Аватары с других участков смогут видеть аватары на этом участке и общаться с ними в чате, а вы также сможете видеть их и общаться с ними."/>
-			<text name="landing_point">
+			<check_box label="Видны аватары" left="262" name="SeeAvatarsCheck" tool_tip="Аватары с других участков смогут видеть аватары на этом участке и общаться с ними в чате, а вы также сможете видеть их и общаться с ними."/>
+			<text name="landing_point" width="225">
 				В точку телепортации: [LANDING]
 			</text>
 			<button label="Задать" label_selected="Задать" name="Set" tool_tip="Установить точку телепортации, в которую будут прибывать посетители, Ставится в месте вашего аватара на этом участке."/>
@@ -372,7 +372,7 @@
 			<text name="Teleport Routing: ">
 				Вариант телепортации:
 			</text>
-			<combo_box name="landing type" tool_tip="Вариант телепортации – выберите, каким образом будет производиться телепортация на вашу землю">
+			<combo_box name="landing type" width="150" tool_tip="Вариант телепортации – выберите, каким образом будет производиться телепортация на вашу землю">
 				<combo_box.item label="В черном списке" name="Blocked"/>
 				<combo_box.item label="В точку телепортации" name="LandingPoint"/>
 				<combo_box.item label="В любое место" name="Anywhere"/>
@@ -439,7 +439,7 @@
 			<panel.string name="estate_override">
 				Часть этих параметров установлена на уровне землевладения
 			</panel.string>
-			<check_box label="Доступ открыт для всех (При снятия выделения будет создана запись в строке запрета)" name="public_access"/>
+			<check_box label="Доступ открыт для всех" tool_tip="При снятия выделения будет создана запись в строке запрета" name="public_access"/>
 			<check_box label="Должен быть 18 и старше [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Доступ к этому участку имеют только жители 18 лет и старше. Более подробная информация находится здесь: [SUPPORT_SITE]."/>
 			<check_box label="Информация о платежах должна быть в файле [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Для доступа к этому участку у жителя должна быть зарегистрирована информация об оплате.  Более подробная информация находится здесь: [SUPPORT_SITE]."/>
 			<check_box label="Разрешить группе [GROUP] без всяких ограничений" name="GroupCheck" tool_tip="Группа устанавливается на основной вкладке."/>
diff --git a/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml
deleted file mode 100644
index 1d3ff3f5ed8743537037fbd4fbdfa60cf9ee87f1..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="ТОРГОВЫЕ ИСХОДЯЩИЕ">
-	<string name="OutboxFolderCount1">
-		1 папка
-	</string>
-	<string name="OutboxFolderCountN">
-		[NUM] папки
-	</string>
-	<string name="OutboxImporting">
-		Отправка папок....
-	</string>
-	<string name="OutboxInitializing">
-		Инициализация...
-	</string>
-	<panel label="" name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					Загрузка...
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					Перетаскивайте предметы для создания папок
-				</text>
-			</panel>
-			<button label="Отправить в торговый центр" name="outbox_import_btn" tool_tip="Выставить на витрину моего магазина"/>
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml
deleted file mode 100644
index 0095d48af9f89ef0708ee4d6abcf8a7394ecd610..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Перетащите вещи сюда, чтобы подготовить их для размещения на витрине вашего магазина"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
index c2fcac8840420d44f94f7600e84a3d12c0723bab..03a714f266e3c35e8445df6afc53e186c70f44da 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
@@ -5,15 +5,15 @@
 		<check_box initial_value="true" label="Воспроизводить анимацию ввода текста при общении" name="play_typing_animation"/>
 		<check_box label="Отправлять мне сообщения по почте, когда меня нет в сети" name="send_im_to_email"/>
 		<check_box label="Только друзья и группы могут звонить мне и отправлять IM" name="voice_call_friends_only_check"/>
-		<text name="font_size">
+		<text name="font_size" left="361">
 			Размер шрифта:
 		</text>
-		<combo_box name="chat_font_size">
+		<combo_box name="chat_font_size" left="361">
 			<item label="Мелкий" name="Small" value="0"/>
 			<item label="Средний" name="Medium" value="1"/>
 			<item label="Крупный" name="Large" value="2"/>
 		</combo_box>
-		<check_box label="Чат в пузырьках" name="bubble_text_chat"/>
+		<check_box label="Чат в пузырьках" name="bubble_text_chat" left_delta="19"/>
 	</panel>
 	<panel name="im_notification_settings">
 		<text name="friend_ims">
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
index d4d0ef9e7ca84bbac88ea1f422caf3d576fa4b17..137e047d977a7753656a459cefaa2a1c3977c925 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
@@ -14,7 +14,7 @@
 	<text name="Web:">
 		Браузер:
 	</text>
-	<radio_group name="preferred_browser_behavior">
+	<radio_group name="preferred_browser_behavior" left_delta="30">
 		<radio_item label="Используйте встроенный браузер для всех ссылок" name="internal" tool_tip="Будет использоваться браузер, заданный в системе по умолчанию. Не рекомендуется, если [APP_NAME] работает в полноэкранном режиме." value="0"/>
 		<radio_item label="Для ссылок Second Life следует использовать только встроенный браузер" name="external" tool_tip="Используйте встроенный браузер для справки, веб-ссылок и т.д. Для ссылок LindenLab/Second Life следует использовать только встроенный браузер." value="1"/>
 		<radio_item label="Для всех ссылок следует использовать встроенный браузер" name="external_all" tool_tip="Для просмотра справки, ссылок на веб-страницы и т. д. будет использоваться встроенный браузер. Этот браузер открывается как новое окно в [APP_NAME]." value="2"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_about_land.xml b/indra/newview/skins/default/xui/tr/floater_about_land.xml
index 48b16e2fdea5d08ee2fb766bfd18e823a0adb689..1101e5055a95101328a65de736007ee51f879aa1 100644
--- a/indra/newview/skins/default/xui/tr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/tr/floater_about_land.xml
@@ -360,10 +360,10 @@ Sadece büyük parseller aramada görünür.
 				Anlık Görüntü:
 			</text>
 			<texture_picker name="snapshot_ctrl" tool_tip="Bir resim seçmek için tıklayın"/>
-			<text name="allow_see_label">
+			<text name="allow_see_label" top="170">
 				Diğer parsellerdeki avatarlar bu parseldeki avatarları görebilir ve onlarla sohbet edebilir
 			</text>
-			<check_box label="Avatarları Gör" name="SeeAvatarsCheck" tool_tip="Diğer parsellerdeki avatarların bu parseldeki avatarları görmesine ve onlarla sohbet etmesine, sizin de onları görüp, onlarla sohbet etmenize imkan tanır."/>
+			<check_box label="Avatarları Gör" name="SeeAvatarsCheck" top="170" tool_tip="Diğer parsellerdeki avatarların bu parseldeki avatarları görmesine ve onlarla sohbet etmesine, sizin de onları görüp, onlarla sohbet etmenize imkan tanır."/>
 			<text name="landing_point">
 				İniş Noktası: [LANDING]
 			</text>
diff --git a/indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml
deleted file mode 100644
index e5643f3bf645add1dac156fc8deb29a300f962a1..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="SATICI GÄ°DEN KUTUSU">
-	<string name="OutboxFolderCount1">
-		1 klasör
-	</string>
-	<string name="OutboxFolderCountN">
-		[NUM] klasör
-	</string>
-	<string name="OutboxImporting">
-		Klasörler gönderiliyor...
-	</string>
-	<string name="OutboxInitializing">
-		Başlatılıyor...
-	</string>
-	<panel label="" name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					Yükleniyor...
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					Klasör oluşturmak için öğeleri buraya sürükleyin
-				</text>
-			</panel>
-			<button label="Pazaryerine Gönder" name="outbox_import_btn" tool_tip="Pazaryeri Vitrinime Gönder"/>
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml
deleted file mode 100644
index a947eee15051bc3291abca4474b1e298bb7370f0..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="Öğeleri vitrininizde satışa hazırlamak için sürükleyip buraya bırakın"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml
deleted file mode 100644
index e6a70a77248c9d52dc4e10c06cd827434270255e..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/zh/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_merchant_outbox" title="商家發件匣">
-	<string name="OutboxFolderCount1">
-		1 個資料夾
-	</string>
-	<string name="OutboxFolderCountN">
-		[NUM] 個資料夾
-	</string>
-	<string name="OutboxImporting">
-		正在傳送資料夾…
-	</string>
-	<string name="OutboxInitializing">
-		正在初始化…
-	</string>
-	<panel label="" name="panel_1">
-		<panel name="panel_2">
-			<panel name="outbox_inventory_placeholder_panel">
-				<text name="outbox_inventory_placeholder_title">
-					載入中…
-				</text>
-			</panel>
-		</panel>
-		<panel name="panel_3">
-			<panel name="outbox_generic_drag_target">
-				<text name="text_1">
-					把物項拖曳到這裡,可建立資料夾
-				</text>
-			</panel>
-			<button label="送往第二人生購物市集" name="outbox_import_btn" tool_tip="推到我第二人生購物市集的店面"/>
-		</panel>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml
deleted file mode 100644
index 8de0bb0e4d143bf38c03595513c77493d67fc3d1..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/zh/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<outbox_inventory_panel name="inventory_outbox" tool_tip="將物項拖曳並置放到這裡,準備在你的商店出售"/>
diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp
index d7e87ed52ea5dc0c1a8d9c9853a358774c1fd180..caa3016d2e9e92f0eb061ea2b89c8c0761dff90c 100644
--- a/indra/newview/tests/llsecapi_test.cpp
+++ b/indra/newview/tests/llsecapi_test.cpp
@@ -60,12 +60,22 @@ LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(X509* openssl_cert
 LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) { return NULL; }
 LLPointer<LLCertificateStore> LLSecAPIBasicHandler::getCertificateStore(const std::string& store_id) { return NULL; }
 void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type, const std::string& data_id, const LLSD& data) {}
+void LLSecAPIBasicHandler::addToProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem, const LLSD& data) {}
+void LLSecAPIBasicHandler::removeFromProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem) {}
 LLSD LLSecAPIBasicHandler::getProtectedData(const std::string& data_type, const std::string& data_id) { return LLSD(); }
 void LLSecAPIBasicHandler::deleteProtectedData(const std::string& data_type, const std::string& data_id) {}
 LLPointer<LLCredential> LLSecAPIBasicHandler::createCredential(const std::string& grid, const LLSD& identifier, const LLSD& authenticator) { return NULL; }
 LLPointer<LLCredential> LLSecAPIBasicHandler::loadCredential(const std::string& grid) { return NULL; }
 void LLSecAPIBasicHandler::saveCredential(LLPointer<LLCredential> cred, bool save_authenticator) {}
 void LLSecAPIBasicHandler::deleteCredential(LLPointer<LLCredential> cred) {}
+bool LLSecAPIBasicHandler::hasCredentialMap(const std::string& storage, const std::string& grid) { return false; }
+bool LLSecAPIBasicHandler::emptyCredentialMap(const std::string& storage, const std::string& grid) { return false; }
+void LLSecAPIBasicHandler::loadCredentialMap(const std::string& storage, const std::string& grid, credential_map_t& credential_map) {}
+LLPointer<LLCredential> LLSecAPIBasicHandler::loadFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey) { return NULL; }
+void LLSecAPIBasicHandler::addToCredentialMap(const std::string& storage, LLPointer<LLCredential> cred, bool save_authenticator) {}
+void LLSecAPIBasicHandler::removeFromCredentialMap(const std::string& storage, LLPointer<LLCredential> cred) {}
+void LLSecAPIBasicHandler::removeFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey) {}
+void LLSecAPIBasicHandler::removeCredentialMap(const std::string& storage, const std::string& grid) {}
 
 // -------------------------------------------------------------------------------------------
 // TUT