diff --git a/.hgtags b/.hgtags
index 216066ea006f1b061079a6b35e715cf35f5233c4..10109c2e1e54b0bda48c437359c70e8b64c10fe2 100644
--- a/.hgtags
+++ b/.hgtags
@@ -184,6 +184,11 @@ f2412ecd6740803ea9452f1d17fd872e263a0df7 3.0.2-start
 e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e DRTVWR-86_3.0.2-beta2
 e5c9af2d7980a99a71650be3a0cf7b2b3c3b897e 3.0.2-beta2
 b95ddac176ac944efdc85cbee94ac2e1eab44c79 3.0.3-start
+1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-78_3.0.0-release
+0000000000000000000000000000000000000000 DRTVWR-78_3.0.0-release
+1778f26b6d0ae762dec3ca37140f66620f2485d9 DRTVWR-77_3.0.0-release
 6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 DRTVWR-85_3.0.3-beta1
 586907287be581817b2422b5137971b22d54ea48 3.0.4-start
 6694f3f062aa45f64ab391d25a3eb3d5eb1b0871 3.0.3-beta1
+61aa7974df089e8621fe9a4c69bcdefdb3cc208a DRTVWR-89_3.0.3-beta2
+61aa7974df089e8621fe9a4c69bcdefdb3cc208a 3.0.3-beta2
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index c732e3bc77999ad8b5b697aa30270a9e6ea8396a..b631b96252f0b6a1dea8db677c67a753f4c5ceed 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -195,7 +195,8 @@ class LL_COMMON_API LLMutex : public LLMutexBase
 	}
 	~LLMutex()
 	{
-		llassert(!isLocked()); // better not be locked!
+		//this assertion erroneously triggers whenever an LLCondition is destroyed
+		//llassert(!isLocked()); // better not be locked!
 		apr_thread_mutex_destroy(mAPRMutexp);
 		mAPRMutexp = NULL;
 	}
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 14e169c6b1011a351d582a0ae8e9b131e2daaf19..280a8942a8bbe0a659a1811bc497d6196efa0407 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -222,7 +222,7 @@ namespace boost
 std::set<CURL*> LLCurl::Easy::sFreeHandles;
 std::set<CURL*> LLCurl::Easy::sActiveHandles;
 LLMutex* LLCurl::Easy::sHandleMutex = NULL;
-
+LLMutex* LLCurl::Easy::sMultiMutex = NULL;
 
 //static
 CURL* LLCurl::Easy::allocEasyHandle()
@@ -606,6 +606,7 @@ void LLCurl::Multi::run()
 		mPerformState = PERFORM_STATE_PERFORMING;
 		if (!mQuitting)
 		{
+			LLMutexLock lock(LLCurl::Easy::sMultiMutex);
 			doPerform();
 		}
 	}
@@ -1179,6 +1180,7 @@ void LLCurl::initClass(bool multi_threaded)
 	check_curl_code(code);
 	
 	Easy::sHandleMutex = new LLMutex();
+	Easy::sMultiMutex = new LLMutex();
 
 #if SAFE_SSL
 	S32 mutex_count = CRYPTO_num_locks();
@@ -1200,6 +1202,8 @@ void LLCurl::cleanupClass()
 
 	delete Easy::sHandleMutex;
 	Easy::sHandleMutex = NULL;
+	delete Easy::sMultiMutex;
+	Easy::sMultiMutex = NULL;
 
 	for (std::set<CURL*>::iterator iter = Easy::sFreeHandles.begin(); iter != Easy::sFreeHandles.end(); ++iter)
 	{
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
old mode 100644
new mode 100755
index 213b281e72de5f3602ecd83d01cb8d96b67ce88c..87de202717ca5c03e75b53fcd350f8ecd68485f4
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -232,6 +232,7 @@ class LLCurl::Easy
 
 private:
 	friend class LLCurl;
+	friend class LLCurl::Multi;
 
 	CURL*				mCurlEasyHandle;
 	struct curl_slist*	mHeaders;
@@ -251,6 +252,7 @@ class LLCurl::Easy
 	static std::set<CURL*> sFreeHandles;
 	static std::set<CURL*> sActiveHandles;
 	static LLMutex* sHandleMutex;
+	static LLMutex* sMultiMutex;
 };
 
 class LLCurl::Multi : public LLThread
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index 0935a0005b4ed5907be5f7dd261377044580d2b2..db578483209b23ae6d202e9fd889c71c9eaea1f3 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -132,7 +132,7 @@ class LLProtectedDataException
 // LLCertificates are considered unmodifiable
 // Certificates are pulled out of stores, or created via
 // factory calls
-class LLCertificate : public LLRefCount
+class LLCertificate : public LLThreadSafeRefCount
 {
 	LOG_CLASS(LLCertificate);
 public:
@@ -170,7 +170,7 @@ class LLCertificateVector : public LLThreadSafeRefCount
 	
 	// base iterator implementation class, providing
 	// the functionality needed for the iterator class.
-	class iterator_impl : public LLRefCount
+	class iterator_impl : public LLThreadSafeRefCount
 	{
 	public:
 		iterator_impl() {};
@@ -289,7 +289,7 @@ bool operator!=(const LLCertificateVector::iterator& _lhs, const LLCertificateVe
 // * Persistence of credential information based on grid (for saving username/password)
 // * Serialization to an OGP identifier/authenticator pair
 // 
-class LLCredential  : public LLRefCount
+class LLCredential  : public LLThreadSafeRefCount
 {
 public:
 	
@@ -424,7 +424,7 @@ class LLCertValidationInvalidSignatureException : public LLCertException
 
 // LLSecAPIHandler Class
 // Interface handler class for the various security storage handlers.
-class LLSecAPIHandler : public LLRefCount
+class LLSecAPIHandler : public LLThreadSafeRefCount
 {
 public:
 	
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index f53b08a4bc914ec86ec7672bbce36f482ed0cc26..0d28b3c042ca47fb6d0e5226ef74f7825cce34da 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -685,7 +685,6 @@ LLSideTrayTab* LLSideTray::getTab(const std::string& name)
 bool LLSideTray::isTabAttached(const std::string& name)
 {
 	LLSideTrayTab* tab = getTab(name);
-	llassert(tab);
 	if (!tab) return false;
 
 	return std::find(mTabs.begin(), mTabs.end(), tab) != mTabs.end();
diff --git a/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml
index 449731ab8906ad9c5811e3bb2e4e478163aa78f2..93bfe53aae9193531c539f04310cbfd2b74018db 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml
@@ -29,7 +29,7 @@
 	 height="10"
 	 left_delta="23"
 	 layout="topleft"
-	 name="Proxy location"
+	 name="http_proxy_label"
 	 top_pad="10"
 	 width="300">
 	    HTTP Proxy:
@@ -81,7 +81,7 @@
 	 height="10"
 	 layout="topleft"
 	 left_delta="23"
-	 name="Proxy location"
+	 name="socks5_proxy_label"
 	 top_pad="10"
 	 width="300">
 	    SOCKS 5 Proxy:
@@ -125,7 +125,7 @@
 	 height="10"
 	 layout="topleft"
 	 left="40"
-	 name="Proxy location"
+	 name="socks_auth_label"
 	 top_pad="15"
 	 width="300">
 	    SOCKS Authentication:
@@ -163,6 +163,7 @@
 	 height="10"
 	 layout="topleft"
 	 left_delta="20"
+	 name="socks5_username_label"
 	 top_delta="50"
 	 width="200">
 	    Username:
@@ -174,6 +175,7 @@
 	 height="10"
 	 left_pad="15"
 	 layout="topleft"
+	 name="socks5_password_label"
 	 width="200">
 	    Password:
 	</text>
@@ -207,7 +209,7 @@
 	 height="10"
 	 layout="topleft"
 	 left="25"
-	 name="Proxy location"
+	 name="other_proxy_label"
 	 top_pad="18"
 	 width="300">
 	   Other HTTP traffic proxy:
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index 9749b6fdd46cd3a042906f3e55395975b3782db7..51ffec4727141fdbaeecf7a4f6b5eeadbf4823a7 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -146,7 +146,8 @@
           border.highlight_light_color="FocusColor"
           border.highlight_dark_color="FocusColor"
           border.shadow_light_color="FocusColor"
-          border.shadow_dark_color="FocusColor"/>
+          border.shadow_dark_color="FocusColor"
+          mouse_wheel_opaque="true" />
         </search_combo_box>
 	</panel>
     <favorites_bar