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/.hgignore b/.gitignore
similarity index 64%
rename from .hgignore
rename to .gitignore
index 0d672e6ebc35bdc7399b31425ae4bc65feb5a0b2..27b629a578c0f410ffd187c2babda05f5c9eaa56 100755
--- a/.hgignore
+++ b/.gitignore
@@ -1,45 +1,56 @@
-syntax: glob
-
-# 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
@@ -47,36 +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/lib/python/mulib.*
-^web/locale.*
-^web/secondlife.com.*
-^web/config.*
-^indra/web/dataservice/locale.*
-^indra/web/dataservice/lib/shared/vault.*
-^indra/web/dataservice/vendor.*
-glob:indra/newview/dbghelp.dll
-glob:*.cpp.orig
-glob:*.cpp.bak
-glob:*.h.bak
-glob:*.h.orig
-glob:indra/newview/typed_locations.txt
-glob:indra/newview/teleport_history.txt
-glob:indra/newview/search_history.txt
-glob:indra/newview/filters.xml
-glob:indra/newview/avatar_icons_cache.txt
-glob:indra/newview/avatar_lad.log
-glob:*.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/.hgtags b/.hgtags
index b333b9384d9285b923658970f6719c8926ad9e23..beb2da41912f978861a92fa77dade6a14fd65577 100755
--- a/.hgtags
+++ b/.hgtags
@@ -556,3 +556,4 @@ ece699718f163921717bb95a6131e94af4c4138f 6.3.1-release
 07f5d5bc9faebb45695853d40a9549773db816c0 6.3.2-release
 d9a4bd15e2c852953d6c8e84d6f3b7ca442c0e7f 6.3.3-release
 4033b3f57e76f087235145a3016886ccdc87ffa3 6.3.4-release
+27ca5834bfe9b80e82db5ea42f08b7eb990b722a 6.3.5-release
diff --git a/autobuild.xml b/autobuild.xml
index b182b7ae5d6d35b7efe02e461b6d92f5ab1d80fd..1f1db48bdc1c5b58d2ba31880c04bad6037f674e 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/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/lltextbase.h b/indra/llui/lltextbase.h
index 4239cdf43c52109c4c68974052bd03eede43d891..058b804714bc2fdc752e3bef32d1adc81f93f4d8 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -441,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/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index b98d1d3fa746f67079f0a6fc24649c7aff21ddea..c44315e3f0e51834b20a07275de829f585f0c03f 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.3.5
+6.3.7
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index bbb726ddb0eb6f1dbdaac2cc50e185f6fc17e829..b232a8c3bbfeb3bc6002aa8da53ef1f422c61065 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -671,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.
@@ -1949,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,""), "*.*");
@@ -1990,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();
@@ -4461,7 +4470,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/llfloaterforgetuser.cpp b/indra/newview/llfloaterforgetuser.cpp
index 363951041afe02f513fd8539b8889cac8186dd61..97b022699f1abaf0131165d8f347359d6b0f3a27 100644
--- a/indra/newview/llfloaterforgetuser.cpp
+++ b/indra/newview/llfloaterforgetuser.cpp
@@ -29,11 +29,15 @@
 
 #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"
 
 
@@ -54,55 +58,66 @@ LLFloaterForgetUser::~LLFloaterForgetUser()
 
 BOOL LLFloaterForgetUser::postBuild()
 {
-    // Note, storage works per grid, whatever is selected currently in login screen or logged in.
-    // Since login screen can change grid, store the value.
-    mGrid = LLGridManager::getInstance()->getGrid();
+    mScrollList = getChild<LLScrollListCtrl>("user_list");
 
-    LLScrollListCtrl *scroll_list = getChild<LLScrollListCtrl>("user_list");
-    if (gSecAPIHandler->hasCredentialMap("login_list", mGrid))
-    {
-        LLSecAPIHandler::credential_map_t credencials;
-        gSecAPIHandler->loadCredentialMap("login_list", mGrid, credencials);
 
-        LLSecAPIHandler::credential_map_t::iterator cr_iter = credencials.begin();
-        LLSecAPIHandler::credential_map_t::iterator cr_end = credencials.end();
-        while (cr_iter != cr_end)
+    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 (cr_iter->second.notNull()) // basic safety
+            if (!grid_iter->first.empty()
+                && grid_iter->first != MAINGRID) // a workaround since 'mIsInProductionGrid' might not be set
             {
-                LLScrollListItem::Params item_params;
-                item_params.value(cr_iter->first);
-                item_params.columns.add()
-                    .value(LLPanelLogin::getUserName(cr_iter->second))
-                    .column("user")
-                    .font(LLFontGL::getFontSansSerifSmall());
-                scroll_list->addRow(item_params, ADD_BOTTOM);
+                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;
+                    }
+                }
             }
-            cr_iter++;
         }
-        scroll_list->selectFirstItem();
+    }
+
+    mUserGridsCount.clear();
+    if (!show_grid_marks)
+    {
+        // just load maingrid
+        loadGridToList(MAINGRID, false);
     }
     else
     {
-        LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(mGrid);
-        if (cred.notNull())
+        for (std::map<std::string, std::string>::iterator grid_iter = known_grids.begin();
+            grid_iter != known_grids.end();
+            grid_iter++)
         {
-            const LLSD &ident = cred->getIdentifier();
-            if (ident.isMap() && ident.has("type"))
+            if (!grid_iter->first.empty())
             {
-                LLScrollListItem::Params item_params;
-                item_params.value(cred->userID());
-                item_params.columns.add()
-                    .value(LLPanelLogin::getUserName(cred))
-                    .column("user")
-                    .font(LLFontGL::getFontSansSerifSmall());
-                scroll_list->addRow(item_params, ADD_BOTTOM);
-                scroll_list->selectFirstItem();
+                loadGridToList(grid_iter->first, true);
             }
         }
     }
 
-    bool enable_button = scroll_list->getFirstSelectedIndex() != -1;
+    mScrollList->selectFirstItem();
+    bool enable_button = mScrollList->getFirstSelectedIndex() != -1;
     LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
     chk_box->setEnabled(enable_button);
     chk_box->set(FALSE);
@@ -115,36 +130,88 @@ BOOL LLFloaterForgetUser::postBuild()
 
 void LLFloaterForgetUser::onForgetClicked()
 {
-    mLoginPanelDirty = true;
     LLScrollListCtrl *scroll_list = getChild<LLScrollListCtrl>("user_list");
-    std::string user_key = scroll_list->getSelectedValue();
+    LLSD user_data = scroll_list->getSelectedValue();
+    const std::string user_id = user_data["user_id"];
 
-    // remove creds
-    gSecAPIHandler->removeFromCredentialMap("login_list", mGrid, user_key);
+    LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
+    BOOL delete_data = chk_box->getValue();
 
-    LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(mGrid);
-    if (cred.notNull() && cred->userID() == user_key)
+    if (delete_data && mUserGridsCount[user_id] > 1)
     {
-        gSecAPIHandler->deleteCredential(cred);
+        // more than 1 grid uses this id
+        LLNotificationsUtil::add("LoginRemoveMultiGridUserData", LLSD(), LLSD(), boost::bind(&LLFloaterForgetUser::onConfirmForget, this, _1, _2));
+        return;
     }
 
-    // Clean data
-    LLCheckBoxCtrl *chk_box = getChild<LLCheckBoxCtrl>("delete_data");
-    BOOL delete_data = chk_box->getValue();
-    if (delete_data)
+    processForgetUser();
+}
+
+bool LLFloaterForgetUser::onConfirmForget(const LLSD& notification, const LLSD& response)
+{
+    S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+    if (option == 0)
     {
-        // key is edentical to one we use for name of user's folder
-        std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + user_key;
-        gDirUtilp->deleteDirAndContents(user_path);
+        processForgetUser();
+    }
+    return false;
+}
 
-        // Clean favorites, label is edentical to username
-        LLFavoritesOrderStorage::removeFavoritesRecordOfUser(scroll_list->getSelectedItemLabel(), mGrid);
+// 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());
 
-        // 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.
+        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();
@@ -157,4 +224,125 @@ void LLFloaterForgetUser::onForgetClicked()
     }
 }
 
+//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
index 119aece2d10f522ab68fa7a3ffe80736f40ff6b0..801fcbb4127b78920c32f98befb248d99f60c3b9 100644
--- a/indra/newview/llfloaterforgetuser.h
+++ b/indra/newview/llfloaterforgetuser.h
@@ -29,6 +29,8 @@
 
 #include "llfloater.h"
 
+class LLScrollListCtrl;
+
 class LLFloaterForgetUser : public LLFloater
 {
 public:
@@ -39,8 +41,16 @@ class LLFloaterForgetUser : public LLFloater
     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::string mGrid;
+    std::map<std::string, S32> mUserGridsCount;
 };
 
 #endif
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 4fd39d12117ac933379f12137eee818a5ac03478..7ef3685cdb2158aabbedcc7c5efdabd8973d5992 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -549,18 +549,20 @@ void LLPanelLogin::populateFields(LLPointer<LLCredential> credential, bool remem
         LL_WARNS() << "Attempted fillFields with no login view shown" << LL_ENDL;
         return;
     }
-    LLUICtrl* remember_check = sInstance->getChild<LLUICtrl>("remember_check");
-    remember_check->setValue(remember_psswrd);
     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);
-        remember_check->setEnabled(remember_user);
     }
 }
 
@@ -610,15 +612,19 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential)
 		    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(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();
@@ -642,7 +648,8 @@ 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;
 	}
 }
 
@@ -660,7 +667,7 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
 	LLSD identifier = LLSD::emptyMap();
 	LLSD authenticator = LLSD::emptyMap();
 
-	std::string username = sInstance->getChild<LLComboBox>("username_combo")->getValue().asString();
+	std::string username = sInstance->getChild<LLComboBox>("username_combo")->getSimple();
 	std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
 	LLStringUtil::trim(username);
 
@@ -742,13 +749,14 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
 		}
 	}
 	credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator);
-	remember_psswrd = 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'
     }
 }
@@ -763,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;
 		}
@@ -1079,6 +1084,7 @@ void LLPanelLogin::onUserNameTextEnty(void*)
 {
     sInstance->mPasswordModified = true;
     sInstance->getChild<LLUICtrl>("password_edit")->setValue(std::string());
+    sInstance->mPasswordLength = 0;
     sInstance->addFavoritesToStartLocation(); //will call updateLoginButtons()
 }
 
@@ -1112,14 +1118,22 @@ void LLPanelLogin::onUserListCommit(void*)
 }
 
 // static
+// At the moment only happens if !mFirstLoginThisInstall
 void LLPanelLogin::onRememberUserCheck(void*)
 {
-    if (sInstance)
+    if (sInstance && !sInstance->mFirstLoginThisInstall)
     {
         LLCheckBoxCtrl* remember_name(sInstance->getChild<LLCheckBoxCtrl>("remember_name"));
-        LLCheckBoxCtrl* remember_psswrd(sInstance->getChild<LLCheckBoxCtrl>("remember_check"));
+        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);
     }
 }
@@ -1148,8 +1162,32 @@ 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())
+			{
+				// 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()
@@ -1185,12 +1223,15 @@ void LLPanelLogin::updateLoginButtons()
 
 	login_btn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0);
 
-    if (!mFirstLoginThisInstall)
-    {
-        LLComboBox* user_combo = getChild<LLComboBox>("username_combo");
-        LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
-        remember_name->setEnabled(user_combo->getCurrentIndex() == -1);
-    }
+	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)
@@ -1198,6 +1239,8 @@ 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()))
     {
@@ -1220,6 +1263,8 @@ void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)
         {
             // selection failed, just deselect whatever might be selected
             user_combo->setValue(std::string());
+            getChild<LLUICtrl>("password_edit")->setValue(std::string());
+            updateLoginButtons();
         }
         else
         {
@@ -1236,6 +1281,14 @@ void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential)
                 user_combo->add(LLPanelLogin::getUserName(credential), credential->userID(), ADD_BOTTOM, TRUE);
                 setFields(credential);
             }
+            else
+            {
+                updateLoginButtons();
+            }
+        }
+        else
+        {
+            updateLoginButtons();
         }
     }
 }
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/llsecapi.h b/indra/newview/llsecapi.h
index c0f0a367c75a5efd7be869bf177768703391ceb4..69b6b32923505fd7aaee0774e0e5b6fc07f9e584 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -491,6 +491,10 @@ class LLSecAPIHandler : public LLThreadSafeRefCount
 	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,
diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index a8bb54a90ed0949640506ff5a6709e4178e48fdd..55e49100c3538a9bfb9ad2e80cf6d00a63626dcd 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -1664,6 +1664,19 @@ bool LLSecAPIBasicHandler::hasCredentialMap(const std::string& storage, const st
     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)
 {
diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h
index 426b5d392aeb1f3ecfc23fcd20318afbbb56e1cb..0bc7f5230f8a69be187ae8b5659efce7eb98209a 100644
--- a/indra/newview/llsechandler_basic.h
+++ b/indra/newview/llsechandler_basic.h
@@ -293,6 +293,10 @@ class LLSecAPIBasicHandler : public LLSecAPIHandler
 	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,
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 08012686f99c7795d2970976a3d523a35fcf5e2b..684d3bd4218f5ccf70ea163d31a7450b740e9f3a 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2715,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/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 05230c17e0421bae9dd161c4b33cc44bd669c97e..fe3e4cdd617132e2dfdaa9be12f66c790d1954e8 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -2987,6 +2987,7 @@ void LLViewerObject::fetchInventoryFromServer()
 	if (!isInventoryPending())
 	{
 		delete mInventory;
+		mInventory = NULL;
 
 		// Results in processTaskInv
 		LLMessageSystem* msg = gMessageSystem;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index e28272e10beefe662dc960af8d40f2be1c19c410..bec33790bd9edc5dc6e51cd6fba7cf408641b662 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8685,10 +8685,24 @@ void LLPipeline::renderDeferredLighting()
 					}
 
 					const LLViewerObject *vobj = drawablep->getVObj();
-					if((vobj && vobj->getAvatar() && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList()))
-						|| (vobj && dist_vec(vobj->getPosition(), LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip))
+					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/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/en/floater_forget_user.xml b/indra/newview/skins/default/xui/en/floater_forget_user.xml
index 86228d49ee5433162f7430b016e107fd9d56e5a5..a9ec1b74a3b4d16c951f06d2eef2a4ba6d44eb9b 100644
--- a/indra/newview/skins/default/xui/en/floater_forget_user.xml
+++ b/indra/newview/skins/default/xui/en/floater_forget_user.xml
@@ -35,5 +35,5 @@
      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"/>
+     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/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 1c72aec700719d1eb65cafa530db6fe174cefa68..e3776cdc1a4a5b294da06fdd6b2fe512971f3929 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3550,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"
@@ -3603,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"
@@ -6062,7 +6094,7 @@ Would you like to turn off Do Not Disturb before completing this transaction?
    name="ParcelPlayingMedia"   
    persist="false"
    type="notify">
-This land has media:
+This location plays media:
 [URL]
 Would you like to play it?
     <tag>confirm</tag>
@@ -6080,7 +6112,7 @@ Would you like to play it?
        ignore="Ignore Media"
        index="0"
        name="No"
-       text="Ignore"/>
+       text="Don't play"/>
     </form>
   </notification>
 
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 766406e1d8f74bb0baa5b2e0a70b1d34bff76b20..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">
@@ -135,10 +135,11 @@
     bottom_delta="21"
     height="24"
     label="Remember me"
+    word_wrap="down"
     check_button.bottom="3"
     name="remember_name"
     tool_tip="Already remembered user can be forgotten from Me &gt; Preferences &gt; Advanced &gt; Remembered Usernames."
-    width="145" />
+    width="198" />
   <check_box
     control_name="RememberPassword"
     follows="left|top"
@@ -148,9 +149,10 @@
     left="408"
     bottom_delta="0"
     label="Remember password"
+    word_wrap="down"
     check_button.bottom="3"
-    name="remember_check"
-    width="145" />
+    name="remember_password"
+    width="165" />
   <combo_box
     allow_text_entry="false"
     font="SansSerifTiny"
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 90f2ca2713c98159488652c7d91a9f9457469cc2..c2defdd772f33b2f7c1f12e498440dc1fa373504 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -344,11 +344,11 @@
         name="media_auto_play_combo"
         width="100">
       <item
-          label="Disabled"
+          label="No"
           name="autoplay_disabled"
           value="0"/>      
       <item
-          label="Enabled"
+          label="Yes"
           name="autoplay_enabled"
           value="1"/>
       <item
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/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/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index 50e2d1a8de539ec5c3dd57a71ed4dfad6667880d..70909b1f7c49b6318dcb4d7c7a0dc078a3d4c1dd 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -371,7 +371,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
 				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" 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">
+			<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"/>
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 96e54bb9bcbb6a55ba5deec74652e42f9ababe96..0e7d0798c79d5cbc3119a0b58cbd27a3d0b6c47b 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -366,7 +366,7 @@ Apenas lotes maiores podem ser listados na busca.
 				Avatares em outros lotes podem ver e conversar com avatares neste lote
 			</text>
 			<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">
+			<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 222572b4bf68e359b86b90045978e19043bc2fe0..fb17896551c075dfc6dccbd9b28e68d7815e981b 100644
--- a/indra/newview/skins/default/xui/ru/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml
@@ -364,7 +364,7 @@
 				Аватары с других участков могут видеть аватары на этом участке и общаться с ними
 			</text>
 			<check_box label="Видны аватары" left="262" name="SeeAvatarsCheck" tool_tip="Аватары с других участков смогут видеть аватары на этом участке и общаться с ними в чате, а вы также сможете видеть их и общаться с ними."/>
-			<text name="landing_point">
+			<text name="landing_point" width="225">
 				В точку телепортации: [LANDING]
 			</text>
 			<button label="Задать" label_selected="Задать" name="Set" 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/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 a1005c654cde01744661dba4f99285c805be73f2..caa3016d2e9e92f0eb061ea2b89c8c0761dff90c 100644
--- a/indra/newview/tests/llsecapi_test.cpp
+++ b/indra/newview/tests/llsecapi_test.cpp
@@ -69,6 +69,7 @@ LLPointer<LLCredential> LLSecAPIBasicHandler::loadCredential(const std::string&
 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) {}