diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..431db7ed59bc5e4b9c14f834f7cc6622a7d4d72b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+Second Life Viewer
+==================
+
+This project manages the source code for the
+[Second Life](https://www.secondlife.com) Viewer.
+
+This source is available as open source; for details on licensing, see
+[https://wiki.secondlife.com/wiki/Linden_Lab_Official:Second_Life_Viewer_Licensing_Program](the
+licensing page on the Second Life wiki)
+
+For information on how to use and contribute to this, see
+[https://wiki.secondlife.com/wiki/Open_Source_Portal](the open source
+portal on the wiki).
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 53df40d172b7bf0e84f079678c64c9d3c7d6edb9..f627145e19c1ec78ac0348cc5aa18fbb03a7382e 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -185,6 +185,9 @@ Ansariel Hiller
 	BUG-3764
 	STORM-1984
 	STORM-1979
+	STORM-2083
+	STORM-2094
+	MAINT-4677
 Aralara Rajal
 Arare Chantilly
 	CHUIBUG-191
@@ -328,6 +331,7 @@ Cinder Roxley
     STORM-2037
     STORM-2053
     STORM-2113
+    STORM-2098
 Clara Young
 Coaldust Numbers
     VWR-1095
@@ -723,6 +727,11 @@ Jonathan Yap
 	STORM-2034
 	STORM-2018
 	STORM-2082
+	STORM-2086
+	STORM-2085
+	STORM-2088
+	STORM-2094
+	STORM-2099
 Kadah Coba
 	STORM-1060
     STORM-1843
diff --git a/indra/linux_crash_logger/linux_crash_logger.cpp b/indra/linux_crash_logger/linux_crash_logger.cpp
index 36f62451d7e37d9d1a89d3c274185dac129a3f50..9d5ec33fed74add89e7f34e6ee401a2e542638d5 100755
--- a/indra/linux_crash_logger/linux_crash_logger.cpp
+++ b/indra/linux_crash_logger/linux_crash_logger.cpp
@@ -42,7 +42,7 @@ int main(int argc, char **argv)
     
     if (!(options.has("pid") && options.has("dumpdir")))
     {
-        llwarns << "Insufficient parameters to crash report." << llendl;
+        LL_WARNS() << "Insufficient parameters to crash report." << LL_ENDL;
     }
 
 	if (! app.init())
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 63040e1772a15b4a9239127df183e1b15a3a0df8..73544cb914683c38752950dee53d3d21d3d5ee78 100755
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -362,13 +362,4 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
 #define LL_INFOS_ONCE(...)	lllog(LLError::LEVEL_INFO, true, ##__VA_ARGS__)
 #define LL_WARNS_ONCE(...)	lllog(LLError::LEVEL_WARN, true, ##__VA_ARGS__)
 
-// DEPRECATED: Use the new macros that allow tags and *look* like macros.
-#define lldebugs	LL_COMPILE_TIME_MESSAGE("Warning: lldebugs deprecated, use LL_DEBUGS() instead") LL_DEBUGS()
-#define llinfos		LL_COMPILE_TIME_MESSAGE("Warning: llinfos deprecated, use LL_INFOS() instead") LL_INFOS()
-#define llwarns		LL_COMPILE_TIME_MESSAGE("Warning: llwarns deprecated, use LL_WARNS() instead") LL_WARNS()
-#define llerrs		LL_COMPILE_TIME_MESSAGE("Warning: llerrs deprecated, use LL_ERRS() instead") LL_ERRS()
-#define llcont		LL_COMPILE_TIME_MESSAGE("Warning: llcont deprecated, use LL_CONT instead") LL_CONT
-#define llendl		LL_COMPILE_TIME_MESSAGE("Warning: llendl deprecated, use LL_ENDL instead") LL_ENDL
-
-
 #endif // LL_LLERROR_H
diff --git a/indra/llmath/llcalcparser.h b/indra/llmath/llcalcparser.h
index faa699ff7b609b862dfbeeeba288ef1b59e36b53..e2388d6702d92b1087d276a13429986f73823db9 100755
--- a/indra/llmath/llcalcparser.h
+++ b/indra/llmath/llcalcparser.h
@@ -167,9 +167,9 @@ struct LLCalcParser : grammar<LLCalcParser>
 	F32 _sin(const F32& a) const { return sin(DEG_TO_RAD * a); }
 	F32 _cos(const F32& a) const { return cos(DEG_TO_RAD * a); }
 	F32 _tan(const F32& a) const { return tan(DEG_TO_RAD * a); }
-	F32 _asin(const F32& a) const { return asin(a * RAD_TO_DEG); }
-	F32 _acos(const F32& a) const { return acos(a * RAD_TO_DEG); }
-	F32 _atan(const F32& a) const { return atan(a * RAD_TO_DEG); }
+	F32 _asin(const F32& a) const { return asin(a) * RAD_TO_DEG; }
+	F32 _acos(const F32& a) const { return acos(a) * RAD_TO_DEG; }
+	F32 _atan(const F32& a) const { return atan(a) * RAD_TO_DEG; }
 	F32 _sqrt(const F32& a) const { return sqrt(a); }
 	F32 _log(const F32& a) const { return log(a); }
 	F32 _exp(const F32& a) const { return exp(a); }
diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp
index 6750ee482ab179f85fe3a1736c3cd21bc338e793..6c1333a2af771eff33312a9ce38af744f39f1bf5 100755
--- a/indra/llui/llkeywords.cpp
+++ b/indra/llui/llkeywords.cpp
@@ -673,7 +673,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
 						S32 seg_start = cur - base;
 						S32 seg_end = seg_start + seg_len;
 
-						// llinfos << "Seg: [" << word.c_str() << "]" << llendl;
+						// LL_INFOS("SyntaxLSL") << "Seg: [" << word.c_str() << "]" << LL_ENDL;
 
 						insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor);
 					}
@@ -740,10 +740,10 @@ void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSe
 #ifdef _DEBUG
 void LLKeywords::dump()
 {
-	llinfos << "LLKeywords" << llendl;
+	LL_INFOS() << "LLKeywords" << LL_ENDL;
 
 
-	llinfos << "LLKeywords::sWordTokenMap" << llendl;
+	LL_INFOS() << "LLKeywords::sWordTokenMap" << LL_ENDL;
 	word_token_map_t::iterator word_token_iter = mWordTokenMap.begin();
 	while( word_token_iter != mWordTokenMap.end() )
 	{
@@ -752,7 +752,7 @@ void LLKeywords::dump()
 		++word_token_iter;
 	}
 
-	llinfos << "LLKeywords::sLineTokenList" << llendl;
+	LL_INFOS() << "LLKeywords::sLineTokenList" << LL_ENDL;
 	for (token_list_t::iterator iter = mLineTokenList.begin();
 		 iter != mLineTokenList.end(); ++iter)
 	{
@@ -761,7 +761,7 @@ void LLKeywords::dump()
 	}
 
 
-	llinfos << "LLKeywords::sDelimiterTokenList" << llendl;
+	LL_INFOS() << "LLKeywords::sDelimiterTokenList" << LL_ENDL;
 	for (token_list_t::iterator iter = mDelimiterTokenList.begin();
 		 iter != mDelimiterTokenList.end(); ++iter)
 	{
@@ -772,12 +772,12 @@ void LLKeywords::dump()
 
 void LLKeywordToken::dump()
 {
-	llinfos << "[" <<
+	LL_INFOS() << "[" <<
 		mColor.mV[VX] << ", " <<
 		mColor.mV[VY] << ", " <<
 		mColor.mV[VZ] << "] [" <<
 		wstring_to_utf8str(mToken) << "]" <<
-		llendl;
+		LL_ENDL;
 }
 
 #endif  // DEBUG
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 602a70345061a82a801d0d5b8139beeb5a6a474d..20ec243ec5057e62773f34e002d43dc60c83d111 100755
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1316,6 +1316,7 @@ void LLTextBase::replaceWithSuggestion(U32 index)
 
 
 			setCursorPos(it->first + (S32)suggestion.length());
+			onSpellCheckPerformed();
 
 			break;
 		}
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index dfc10923f3fa82e165bce9f12a385e94abb11755..0698e9b53cd6cf103b56bfc0b02731a109df4fd7 100755
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -362,6 +362,7 @@ class LLTextBase
 	std::string				getMisspelledWord(U32 pos) const;
 	bool					isMisspelledWord(U32 pos) const;
 	void					onSpellCheckSettingsChange();
+	virtual void			onSpellCheckPerformed(){}
 
 	// used by LLTextSegment layout code
 	bool					getWordWrap() { return mWordWrap; }
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 926326aaffbe100285d8fe0d109381da85e2007a..d170d17f94108a2d872fc3030de4408c17268c94 100755
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -2380,6 +2380,14 @@ void LLTextEditor::removeTextFromEnd(S32 num_chars)
 
 //----------------------------------------------------------------------------
 
+void LLTextEditor::onSpellCheckPerformed()
+{
+	if (isPristine())
+	{
+		mBaseDocIsPristine = FALSE;
+	}
+}
+
 void LLTextEditor::makePristine()
 {
 	mPristineCmd = mLastCmd;
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index f6bdf917b4127b64551bea91d35712800819b8d4..26702b2412b8fdf4b2d81b01bb40f2f618b9b814 100755
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -160,6 +160,8 @@ class LLTextEditor :
 	autoreplace_callback_t mAutoreplaceCallback;
 	void			setAutoreplaceCallback(autoreplace_callback_t cb) { mAutoreplaceCallback = cb; }
 
+	/*virtual*/ void	onSpellCheckPerformed();
+
 	//
 	// Text manipulation
 	//
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index 12537d9dd18a7ce67685bdd388b2c67f1acec374..c28dbb85775bd9d15e4744bdb4049c48be85c2cd 100755
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -227,6 +227,6 @@ void LLUrlAction::blockObject(std::string url)
 	std::string object_name = getObjectName(url);
 	if (LLUUID::validate(object_id))
 	{
-		executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + object_name);
+		executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + LLURI::escape(object_name));
 	}
 }
diff --git a/indra/mac_crash_logger/mac_crash_logger.cpp b/indra/mac_crash_logger/mac_crash_logger.cpp
index d6b913829ec8d0c15e1a304907b32a5a3d628190..b65a80331eb719b9ee206a67a3e3858225ff1700 100755
--- a/indra/mac_crash_logger/mac_crash_logger.cpp
+++ b/indra/mac_crash_logger/mac_crash_logger.cpp
@@ -41,7 +41,7 @@ int main(int argc, char **argv)
     
     if (!(options.has("pid") && options.has("dumpdir")))
     {
-        llwarns << "Insufficient parameters to crash report." << llendl;
+        LL_WARNS() << "Insufficient parameters to crash report." << LL_ENDL;
     }
     
 	if (! app.init())
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index d7e7f13e87ca5c4febf0d5324cb197209a629dde..5fc73c67d1bfbbf4c17c1f0464bdfbe096274a51 100755
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -96,13 +96,13 @@ LLNetMap::LLNetMap (const Params & p)
 	mToolTipMsg(),
 	mPopupMenu(NULL)
 {
+	mScale = gSavedSettings.getF32("MiniMapScale");
+	mPixelsPerMeter = mScale / REGION_WIDTH_METERS;
 	mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
-	setScale(gSavedSettings.getF32("MiniMapScale"));
 }
 
 LLNetMap::~LLNetMap()
 {
-	gSavedSettings.setF32("MiniMapScale", mScale);
 }
 
 BOOL LLNetMap::postBuild()
@@ -137,6 +137,8 @@ void LLNetMap::setScale( F32 scale )
 	mPixelsPerMeter = mScale / REGION_WIDTH_METERS;
 	mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
 
+	gSavedSettings.setF32("MiniMapScale", mScale);
+
 	mUpdateNow = true;
 }
 
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index f91c4110c0a7c9e1228f1801baa2a729f7376942..e795e7eedb0b8bd1312dc46c2f612aad222362e3 100755
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -168,7 +168,7 @@ class LLAgentHandler : public LLCommandHandler
 		{
 			if (params.size() > 2)
 			{
-				const std::string object_name = params[2].asString();
+				const std::string object_name = LLURI::unescape(params[2].asString());
 				LLMute mute(avatar_id, object_name, LLMute::OBJECT);
 				LLMuteList::getInstance()->add(mute);
 				LLPanelBlockedList::showPanelAndSelect(mute.mID);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 3096d8c7ce7e9f4096d75deb3c4f5429aa392866..7e8bd9a4e0ac7bdaf05dafdd78e84c3e448bc4ef 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2831,6 +2831,8 @@ BOOL enable_object_build(void*)
 
 bool enable_object_edit()
 {
+	if (!isAgentAvatarValid()) return false;
+	
 	// *HACK:  The new "prelude" Help Islands have a build sandbox area,
 	// so users need the Edit and Create pie menu options when they are
 	// there.  Eventually this needs to be replaced with code that only 
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 24131495c31ceb41dd84b42d18d998c365bc9568..506b110afef80f2880f063bb922b296270e5f282 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -2481,8 +2481,9 @@ This is usually a temporary failure. Please customize and save the wearable agai
    icon="alertmodal.tga"
    name="YouHaveBeenLoggedOut"
    type="alertmodal">
-Darn. You have been logged out of [SECOND_LIFE]
-            [MESSAGE]
+Darn. You have been logged out of [SECOND_LIFE].
+
+[MESSAGE]
     <usetemplate
      name="okcancelbuttons"
      notext="Quit"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index f6665a1d5d84512a619af905a02b38997b815fd1..9da044ab64d2e6dbd12e0331c782b762a668dafa 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -39,7 +39,12 @@
          enabled="true"
          label="English"
          name="English"
-         value="en" />        
+         value="en" />
+        <combo_box.item
+         enabled="true"
+         label="Dansk (Danish) - Beta"
+         name="Danish"
+         value="da" />
         <combo_box.item
          enabled="true"
          label="Deutsch (German) - Beta"
@@ -59,7 +64,12 @@
          enabled="true"
          label="Italiano (Italian) - Beta"
          name="Italian"
-         value="it" />        
+         value="it" />
+        <combo_box.item
+         enabled="true"
+         label="Polski (Polish) - Beta"
+         name="Polish"
+         value="pl" />
         <combo_box.item
          enabled="true"
          label="Português (Portuguese) - Beta"