diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index b159092592bac2022512dfaa82b3ffa793225c44..1f578eec5fd90c3a571ef6c3bbb25125f5a82630 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -119,14 +119,14 @@ if (LINUX)
   endif (${GXX_VERSION} STREQUAL ${CXX_VERSION})
 
   # Let's actually get a numerical version of gxx's version
-  STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION ${CXX_VERSION})
+  STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION_NUMBER ${CXX_VERSION})
 
-  # gcc 4.3 and above don't like the LL boost and also 
+  # gcc 4.3 and above don't like the LL boost and also
   # cause warnings due to our use of deprecated headers
-  if(${CXX_VERSION} GREATER 429)
+  if(${CXX_VERSION_NUMBER} GREATER 429)
     add_definitions(-Wno-parentheses)
     set(CMAKE_CXX_FLAGS "-Wno-deprecated ${CMAKE_CXX_FLAGS}")
-  endif (${CXX_VERSION} GREATER 429)
+  endif (${CXX_VERSION_NUMBER} GREATER 429)
 
   # End of hacks.
 
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index 9e9e1aaeaecf4121ef51793b30ee500c6f59d580..bfa2c34c12808666a64ccfe8523c4b2f8535c630 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -31,7 +31,6 @@ set(llaudio_SOURCE_FILES
     llaudioengine.cpp
     lllistener.cpp
     llaudiodecodemgr.cpp
-    llvorbisdecode.cpp
     llvorbisencode.cpp
     )
 
@@ -41,7 +40,6 @@ set(llaudio_HEADER_FILES
     llaudioengine.h
     lllistener.h
     llaudiodecodemgr.h
-    llvorbisdecode.h
     llvorbisencode.h
     llwindgen.h
     )
@@ -60,11 +58,11 @@ if (FMOD)
          )
 
     if (LINUX)
-      if (${CXX_VERSION} MATCHES "4.[23]")
+      if (${CXX_VERSION_NUMBER} GREATER 419)
         set_source_files_properties(llaudioengine_fmod.cpp
                                     llstreamingaudio_fmod.cpp
                                     COMPILE_FLAGS -Wno-write-strings)
-      endif (${CXX_VERSION} MATCHES "4.[23]")
+      endif (${CXX_VERSION_NUMBER} GREATER 419)
     endif (LINUX)
 endif (FMOD)
 
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index ae959eaa81b8ffeef3d27b29c6eeff195daa513b..6bbaad9cefad1b16ece7427be04f199e0fce0f7f 100644
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -33,7 +33,6 @@
 
 #include "llaudiodecodemgr.h"
 
-#include "llvorbisdecode.h"
 #include "llaudioengine.h"
 #include "lllfsthread.h"
 #include "llvfile.h"
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 959313a5b6660be7c8099a32b9b4b0534a41ae24..d7228c78bd3d0eca3c361695600bba85ca340690 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -228,7 +228,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 	{
 		LLButton::Params p_button;
 		p_button.name(std::string("play_media"));
-		p_button.label(""); // provid label but set to empty so name does not overwrite it -angela
+		p_button.label(""); // provide label but set to empty so name does not overwrite it -angela
 		TOOLTIP_PLAYBUTTON_SIZE = 16;
 		LLRect button_rect;
 		button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 65b172b184389c700f9e492722091848a21cdc11..91f43137c5248bbc4f5e4f93199fde4567318482 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -186,7 +186,7 @@ set(viewer_SOURCE_FILES
     llfloatermediasettings.cpp
     llfloatermemleak.cpp
     llfloaternamedesc.cpp
-        llfloaternearbymedia.cpp
+    llfloaternearbymedia.cpp
     llfloaternotificationsconsole.cpp
     llfloateropenobject.cpp
     llfloaterparcel.cpp
@@ -213,6 +213,7 @@ set(viewer_SOURCE_FILES
     llfloaterurldisplay.cpp
     llfloaterurlentry.cpp
     llfloatervoicedevicesettings.cpp
+    llfloatervolumepulldown.cpp
     llfloaterwater.cpp
     llfloaterwhitelistentry.cpp
     llfloaterwindlight.cpp
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 44e68d77455df757c92a665c13c395fc9fa465f3..f7ce826a396b1d0efb583840da927d23a5674c42 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -41,6 +41,7 @@
 #include "lluictrlfactory.h"
 #include "llbutton.h"
 #include "llselectmgr.h"
+#include "llsdutil.h"
 
 LLFloaterMediaSettings* LLFloaterMediaSettings::sInstance = NULL;
 
@@ -145,15 +146,15 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance()
 //static 
 void LLFloaterMediaSettings::apply()
 {
-    LLSD settings;
+	LLSD settings;
 	sInstance->mPanelMediaSettingsGeneral->preApply();
-    sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+	sInstance->mPanelMediaSettingsGeneral->getValues( settings );
 	sInstance->mPanelMediaSettingsSecurity->preApply();
 	sInstance->mPanelMediaSettingsSecurity->getValues( settings );
 	sInstance->mPanelMediaSettingsPermissions->preApply();
-    sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+	sInstance->mPanelMediaSettingsPermissions->getValues( settings );
 	LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA );
-    LLSelectMgr::getInstance()->selectionSetMediaData(settings);
+	LLSelectMgr::getInstance()->selectionSetMediaData(settings);
 	sInstance->mPanelMediaSettingsGeneral->postApply();
 	sInstance->mPanelMediaSettingsSecurity->postApply();
 	sInstance->mPanelMediaSettingsPermissions->postApply();
@@ -183,7 +184,12 @@ void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editab
 
 	sInstance->mPanelMediaSettingsPermissions->
 		initValues( sInstance->mPanelMediaSettingsPermissions, media_settings, editable );
-
+	
+	// Squirrel away initial values 
+	sInstance->mInitialValues.clear();
+	sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues );
+	sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues );
+	sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues );
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -206,7 +212,7 @@ void LLFloaterMediaSettings::clearValues( bool editable)
 {
 	// clean up all panels before updating
 	sInstance->mPanelMediaSettingsGeneral	 ->clearValues(sInstance->mPanelMediaSettingsGeneral,  editable);
-	sInstance->mPanelMediaSettingsSecurity	 ->clearValues(sInstance->mPanelMediaSettingsSecurity,  editable);
+	sInstance->mPanelMediaSettingsSecurity	 ->clearValues(sInstance->mPanelMediaSettingsSecurity,	editable);
 	sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions,  editable);	
 }
 
@@ -235,7 +241,7 @@ void LLFloaterMediaSettings::onBtnApply( void* userdata )
 // static
 void LLFloaterMediaSettings::onBtnCancel( void* userdata )
 {
- 	sInstance->closeFloater(); 
+	sInstance->closeFloater(); 
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -250,7 +256,6 @@ void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click)
 //
 void LLFloaterMediaSettings::enableOkApplyBtns( bool enable )
 {
-	setCtrlsEnabled( enable );
 	childSetEnabled( "OK", enable );
 	childSetEnabled( "Apply", enable );
 }
@@ -265,7 +270,6 @@ const std::string LLFloaterMediaSettings::getHomeUrl()
 		return std::string( "" );
 }
 
-
 ////////////////////////////////////////////////////////////////////////////////
 //
 bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url )
@@ -279,3 +283,36 @@ bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url )
 		// this is all we can do
 		return false;
 }
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual 
+void LLFloaterMediaSettings::draw()
+{
+	// *NOTE: The code below is very inefficient.  Better to do this
+	// only when data change.
+	// Every frame, check to see what the values are.  If they are not
+	// the same as the default media data, enable the OK/Apply buttons
+	LLSD settings;
+	sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+	sInstance->mPanelMediaSettingsSecurity->getValues( settings );
+	sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+
+	bool values_changed = false;
+	
+	LLSD::map_const_iterator iter = settings.beginMap();
+	LLSD::map_const_iterator end = settings.endMap();
+	for ( ; iter != end; ++iter )
+	{
+		const std::string &current_key = iter->first;
+		const LLSD &current_value = iter->second;
+		if ( ! llsd_equals(current_value, mInitialValues[current_key]))
+		{
+			values_changed = true;
+			break;
+		}
+	}
+	
+	enableOkApplyBtns(values_changed);
+	
+	LLFloater::draw();
+}
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index 17a47cb0f5a4b04cd3846574261f251a9855fac8..e2af1705bf7de7223c6370f2360a28f448192b48 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -54,11 +54,13 @@ class LLFloaterMediaSettings :
 	static void apply();
 	static void initValues( const LLSD& media_settings , bool editable);
 	static void clearValues( bool editable);
-	void enableOkApplyBtns( bool enable );
-	LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
-	const std::string getHomeUrl();
+
+	LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};	
+	const std::string getHomeUrl();	
 	bool passesWhiteList( const std::string& test_url );
 
+	virtual void	draw();
+
 	bool mIdenticalHasMediaInfo;
 	bool mMultipleMedia;
 	bool mMultipleValidMedia;
@@ -83,6 +85,10 @@ class LLFloaterMediaSettings :
 	static LLFloaterMediaSettings* sInstance;
 
 private:
+
+	void enableOkApplyBtns( bool enable );
+	
+	LLSD mInitialValues;
 	bool mWaitingToClose;
 };
 
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 5bb266a01d6f287a20dfefd8383f5fbc81e2e31b..b1e7dd3d502846bb71d713e695bf8476f5eb4c3e 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -392,19 +392,19 @@ void LLPanelMediaSettingsGeneral::preApply()
 //
 void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )
 {
-	fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue();
-	fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue();
-	fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue();
-	fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue();
-	fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex();
+	fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue();
+	fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue();
+	fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue();
+	fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue();
+	fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex();
 	//Don't fill in current URL: this is only supposed to get changed via navigate
 	// fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
-	fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue();
+	fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue();
 	// Don't fill in the home URL if it is the special "Multiple Media" string!
 	if (LLTrans::getString("Multiple Media") != mHomeURL->getValue())
-		fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue();
-	fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue();
-	fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue();
+		fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue();
+	fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue();
+	fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index 94e137b0f4fba20634650eb96c723404a8d601d2..7ec53ed57a800ed92b77f477b6ec89c39d226392 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -213,7 +213,7 @@ void LLPanelMediaSettingsSecurity::preApply()
 //
 void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )
 {
-    fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue();
+    fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue();
 
     // iterate over white list and extract items
     std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index dc22a243eb35c4c8a61baa5739d5cf4c0609c79b..4915720036d7dd89fad49dd10cf624537be2a797 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -42,6 +42,7 @@
 #include "llfloaterbuycurrency.h"
 #include "llfloaterchat.h"
 #include "llfloaterlagmeter.h"
+#include "llfloatervolumepulldown.h"
 #include "llfloaterregioninfo.h"
 #include "llfloaterscriptdebug.h"
 #include "llhudicon.h"
@@ -159,6 +160,7 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
 
 	mBtnVolume = getChild<LLButton>( "volume_btn" );
 	mBtnVolume->setClickedCallback( onClickVolume, this );
+	mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));
 
 	gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
 
@@ -203,7 +205,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
 	addChild(mSGPacketLoss);
 
 	childSetActionTextbox("stat_btn", onClickStatGraph);
-
 }
 
 LLStatusBar::~LLStatusBar()
@@ -244,7 +245,6 @@ BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
 
 BOOL LLStatusBar::postBuild()
 {
-
 	gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));
 
 	return TRUE;
@@ -506,6 +506,13 @@ static void onClickScriptDebug(void*)
 	LLFloaterScriptDebug::show(LLUUID::null);
 }
 
+//static
+void LLStatusBar::onMouseEnterVolume(LLUICtrl* ctrl)
+{
+	// show the master volume pull-down
+	LLFloaterReg::showInstance("volume_pulldown");
+}
+
 static void onClickVolume(void* data)
 {
 	// toggle the master mute setting
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index bdaacce981d653b584e0eef1e848658ba5071aef..f77cc1acb863f592a616bee261dfcbfdf946756b 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -47,6 +47,7 @@ class LLUICtrl;
 class LLUUID;
 class LLFrameTimer;
 class LLStatGraph;
+class LLPanelVolumePulldown;
 
 class LLStatusBar
 :	public LLPanel
@@ -92,8 +93,8 @@ class LLStatusBar
 
 	void onVolumeChanged(const LLSD& newvalue);
 
+	static void onMouseEnterVolume(LLUICtrl* ctrl);
 	static void onClickStatGraph(void* data);
-	
 
 private:
 	LLTextBox	*mTextHealth;
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 227f6c49717d078d83840c880d7ad4f75835ca33..1a8edb1f6abba3ce3856ac94b4d32007fc6f9b20 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -106,6 +106,7 @@
 #include "llfloateruipreview.h"
 #include "llfloaterurldisplay.h"
 #include "llfloatervoicedevicesettings.h"
+#include "llfloatervolumepulldown.h"
 #include "llfloaterwater.h"
 #include "llfloaterwhitelistentry.h"
 #include "llfloaterwindlight.h"
@@ -248,6 +249,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
 	LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
 	
+	LLFloaterReg::add("volume_pulldown", "floater_volume_pulldown.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVolumePulldown>);
 	LLFloaterReg::add("voice_call", "floater_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCall>);
 	LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
 	
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index e00f654750cc6218378442a001a7c7e41821efe4..89f1fe35ca0cbb797085e9009cd2b925c93e9d88 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -221,12 +221,23 @@
    width="50" />
    
   <text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="X_label">
-    X
+	X
   </text>
-  <spinner bottom_delta="0"
-	     decimal_digits="0" enabled="true" follows="left|top" height="16"
-	     increment="1" initial_val="256" label="" label_width="0"
-	     left_delta="20" max_val="2048" min_val="0" mouse_opaque="true"
-	     name="height_pixels" width="50" />
+  <spinner 
+	  bottom_delta="0"
+	  decimal_digits="0"
+	  enabled="true"
+	  follows="left|top" 
+	  height="16"
+	  increment="1"
+	  initial_val="256" 
+	  label=""
+	  label_width="0"
+	  left_delta="20" 
+	  max_val="2048" 
+	  min_val="0"
+	  mouse_opaque="true"
+	  name="height_pixels"
+	  width="50" />
  
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 65bc48265dd09f0153bc7d9e2fb693902f015fce..9c66653e3c3be7c0155dde77dc226a8a483d4294 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -81,6 +81,17 @@
      name="volume_btn"
      tool_tip="Global Volume Control"
      width="16" />
+    <panel
+     class="panel_volume_pulldown"
+     follows="all"
+     height="533"
+     layout="topleft"
+     left="0"
+     name="volume_pulldown"
+     top="5"
+     visible="false"
+     width="313" />
+
     <text
      enabled="true"
      follows="right|bottom"