diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp
index 005e427572357182d2fdbeb24a56401a17c3d12d..ddca60867af5c1dab70c4032f8788430670e9bb2 100644
--- a/indra/llplugin/slplugin/slplugin.cpp
+++ b/indra/llplugin/slplugin/slplugin.cpp
@@ -1,11 +1,11 @@
-/** 
+/**
  * @file slplugin.cpp
  * @brief Loader shell for plugins, intended to be launched by the plugin host application, which directly loads a plugin dynamic library.
  *
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
- * 
+ *
  * Second Life Viewer Source Code
  * The source code in this file ("Source Code") is provided by Linden Lab
  * to you under the terms of the GNU General Public License, version 2.0
@@ -13,16 +13,16 @@
  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  * online at http://secondlife.com/developers/opensource/gplv2
- * 
+ *
  * There are special exceptions to the terms and conditions of the GPL as
  * it is applied to this Source Code. View the full text of the exception
  * in the file doc/FLOSS-exception.txt in this software distribution, or
  * online at http://secondlife.com/developers/opensource/flossexception
- * 
+ *
  * By copying, modifying or distributing this software, you acknowledge
  * that you have read and understood your obligations described above,
  * and agree to abide by those obligations.
- * 
+ *
  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
@@ -48,15 +48,15 @@
 
 /*
 	On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist.
-	
+
 	Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags:
-	
+
 	-sectcreate __TEXT __info_plist /path/to/slplugin_info.plist
-	
+
 	which means adding this to the gcc flags:
-	
+
 	-Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist
-	
+
 */
 
 #if LL_DARWIN || LL_LINUX
@@ -67,7 +67,7 @@ static void crash_handler(int sig)
 	// TODO: add our own crash reporting
 	_exit(1);
 }
-#endif	
+#endif
 
 #if LL_WINDOWS
 #include <windows.h>
@@ -80,7 +80,48 @@ LONG WINAPI myWin32ExceptionHandler( struct _EXCEPTION_POINTERS* exception_infop
 	//std::cerr << "intercepted an unhandled exception and will exit immediately." << std::endl;
 
 	// TODO: replace exception handler before we exit?
-	return EXCEPTION_EXECUTE_HANDLER;	
+	return EXCEPTION_EXECUTE_HANDLER;
+}
+
+// Taken from : http://blog.kalmbachnet.de/?postid=75
+// The MSVC 2005 CRT forces the call of the default-debugger (normally Dr.Watson)
+// even with the other exception handling code. This (terrifying) piece of code
+// patches things so that doesn't happen.
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
+	LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter )
+{
+	return NULL;
+}
+
+BOOL PreventSetUnhandledExceptionFilter()
+{
+// WARNING: This won't work on 64-bit Windows systems so we turn it off it.
+//          It should work for any flavor of 32-bit Windows we care about.
+//          If it's off, sometimes you will see an OS message when a plugin crashes
+#ifndef _WIN64
+	HMODULE hKernel32 = LoadLibraryA( "kernel32.dll" );
+	if ( NULL == hKernel32 )
+		return FALSE;
+
+	void *pOrgEntry = GetProcAddress( hKernel32, "SetUnhandledExceptionFilter" );
+	if( NULL == pOrgEntry )
+		return FALSE;
+
+	unsigned char newJump[ 100 ];
+	DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
+	dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
+	void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
+	DWORD dwNewEntryAddr = (DWORD) pNewFunc;
+	DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
+
+	newJump[ 0 ] = 0xE9;  // JMP absolute
+	memcpy( &newJump[ 1 ], &dwRelativeAddr, sizeof( pNewFunc ) );
+	SIZE_T bytesWritten;
+	BOOL bRet = WriteProcessMemory( GetCurrentProcess(), pOrgEntry, newJump, sizeof( pNewFunc ) + 1, &bytesWritten );
+	return bRet;
+#else
+	return FALSE;
+#endif
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -91,6 +132,7 @@ void initExceptionHandler()
 
 	// save old exception handler in case we need to restore it at the end
 	prev_filter = SetUnhandledExceptionFilter( myWin32ExceptionHandler );
+	PreventSetUnhandledExceptionFilter();
 }
 
 bool checkExceptionHandler()
@@ -99,6 +141,8 @@ bool checkExceptionHandler()
 	LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
 	prev_filter = SetUnhandledExceptionFilter(myWin32ExceptionHandler);
 
+	PreventSetUnhandledExceptionFilter();
+
 	if (prev_filter != myWin32ExceptionHandler)
 	{
 		LL_WARNS("AppInit") << "Our exception handler (" << (void *)myWin32ExceptionHandler << ") replaced with " << prev_filter << "!" << LL_ENDL;
@@ -122,7 +166,7 @@ bool checkExceptionHandler()
 }
 #endif
 
-// If this application on Windows platform is a console application, a console is always 
+// If this application on Windows platform is a console application, a console is always
 // created which is bad. Making it a Windows "application" via CMake settings but not
 // adding any code to explicitly create windows does the right thing.
 #if LL_WINDOWS
@@ -133,7 +177,7 @@ int main(int argc, char **argv)
 {
 	ll_init_apr();
 
-	// Set up llerror logging 
+	// Set up llerror logging
 	{
 		LLError::initForApplication(".");
 		LLError::setDefaultLevel(LLError::LEVEL_INFO);
@@ -146,14 +190,14 @@ int main(int argc, char **argv)
 	{
 		LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL;
 	};
-	
+
 	U32 port = 0;
 	if(!LLStringUtil::convertToU32(lpCmdLine, port))
 	{
 		LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL;
 	};
 
-	// Insert our exception handler into the system so this plugin doesn't 
+	// Insert our exception handler into the system so this plugin doesn't
 	// display a crash message if something bad happens. The host app will
 	// see the missing heartbeat and log appropriately.
 	initExceptionHandler();
@@ -162,7 +206,7 @@ int main(int argc, char **argv)
 	{
 		LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL;
 	}
-	
+
 	U32 port = 0;
 	if(!LLStringUtil::convertToU32(argv[1], port))
 	{
@@ -183,17 +227,17 @@ int main(int argc, char **argv)
 	LLPluginProcessChild *plugin = new LLPluginProcessChild();
 
 	plugin->init(port);
-	
+
 	LLTimer timer;
 	timer.start();
 
 #if LL_WINDOWS
 	checkExceptionHandler();
 #endif
-		
+
 	while(!plugin->isDone())
 	{
-		timer.reset();	
+		timer.reset();
 		plugin->idle();
 #if LL_DARWIN
 		{
@@ -204,7 +248,7 @@ int main(int argc, char **argv)
 #endif
 		F64 elapsed = timer.getElapsedTimeF64();
 		F64 remaining = plugin->getSleepTime() - elapsed;
-		
+
 		if(remaining <= 0.0f)
 		{
 			// We've already used our full allotment.
@@ -217,26 +261,26 @@ int main(int argc, char **argv)
 		{
 
 //			LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL;
-//			timer.reset();	
-			
+//			timer.reset();
+
 			// This also services the network as needed.
 			plugin->sleep(remaining);
-			
+
 //			LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" <<  LL_ENDL;
 		}
 
 #if LL_WINDOWS
 	// More agressive checking of interfering exception handlers.
-	// Doesn't appear to be required so far - even for plugins 
-	// that do crash with a single call to the intercept 
+	// Doesn't appear to be required so far - even for plugins
+	// that do crash with a single call to the intercept
 	// exception handler such as QuickTime.
 	//checkExceptionHandler();
 #endif
 	}
 
 	delete plugin;
-	
-	ll_cleanup_apr();	
+
+	ll_cleanup_apr();
 
 	return 0;
 }
diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp
index c8b6e814e13dfb4970fac5132d079d67bab57eb7..62ca569e6cf214ea18df14a9e7156273943c0363 100644
--- a/indra/llui/llprogressbar.cpp
+++ b/indra/llui/llprogressbar.cpp
@@ -72,12 +72,13 @@ LLProgressBar::~LLProgressBar()
 void LLProgressBar::draw()
 {
 	static LLTimer timer;
-
-	LLUIImagePtr bar_fg_imagep = LLUI::getUIImage("progressbar_fill.tga");
+	F32 alpha = getDrawContext().mAlpha;
 	
-	mImageBar->draw(getLocalRect(), mColorBackground.get());
+	LLColor4 image_bar_color = mColorBackground.get();
+	image_bar_color.setAlpha(alpha);
+	mImageBar->draw(getLocalRect(), image_bar_color);
 
-	F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
+	alpha *= 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
 	LLColor4 bar_color = mColorBar.get();
 	bar_color.mV[VALPHA] *= alpha; // modulate alpha
 	LLRect progress_rect = getLocalRect();
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/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 71c1b0cbb940f39d2f0f274a4ba7071eee393d3b..e86123d56517eb95b05240dab8505d19f2eca543 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -66,10 +66,6 @@
 glh::matrix4f glh_get_current_modelview();
 glh::matrix4f glh_get_current_projection();
 
-const F32 ZOOM_NEAR_PADDING		= 1.0f;
-const F32 ZOOM_MEDIUM_PADDING	= 1.15f;
-const F32 ZOOM_FAR_PADDING		= 1.5f;
-
 // Warning: make sure these two match!
 const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };
 const int LLPanelPrimMediaControls::kNumZoomLevels = 2;
@@ -86,7 +82,13 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mUpdateSlider(true),
 	mClearFaceOnFade(false),
 	mCurrentRate(0.0),
-	mMovieDuration(0.0)
+	mMovieDuration(0.0),
+	mTargetObjectID(LLUUID::null),
+	mTargetObjectFace(0),
+	mTargetImplID(LLUUID::null),
+	mTargetObjectNormal(LLVector3::zero),
+	mZoomObjectID(LLUUID::null),
+	mZoomObjectFace(0)
 {
 	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -152,6 +154,11 @@ BOOL LLPanelPrimMediaControls::postBuild()
 	mRightBookend			= getChild<LLUICtrl>("right_bookend");
 	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name"));
 	LLStringUtil::convertToF32(getString("skip_step"), mSkipStep);
+	LLStringUtil::convertToS32(getString("min_width"), mMinWidth);
+	LLStringUtil::convertToS32(getString("min_height"), mMinHeight);
+	LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding);
+	LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding);
+	LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding);
 
 	// These are currently removed...but getChild creates a "dummy" widget.
 	// This class handles them missing.
@@ -257,9 +264,6 @@ LLPluginClassMedia* LLPanelPrimMediaControls::getTargetMediaPlugin()
 
 void LLPanelPrimMediaControls::updateShape()
 {
-	const S32 MIN_HUD_WIDTH=400;
-	const S32 MIN_HUD_HEIGHT=120;
-
 	LLViewerMediaImpl* media_impl = getTargetMediaImpl();
 	LLViewerObject* objectp = getTargetObject();
 	
@@ -279,7 +283,7 @@ void LLPanelPrimMediaControls::updateShape()
 
 	bool can_navigate = parcel->getMediaAllowNavigate();
 	bool enabled = false;
-	bool is_zoomed = (mCurrentZoom != ZOOM_NONE);
+	bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace);
 	// There is no such thing as "has_focus" being different from normal controls set
 	// anymore (as of user feedback from bri 10/09).  So we cheat here and force 'has_focus'
 	// to 'true' (or, actually, we use a setting)
@@ -309,7 +313,7 @@ void LLPanelPrimMediaControls::updateShape()
 		mStopCtrl->setVisible(false);
 		mHomeCtrl->setVisible(has_focus);
 		mZoomCtrl->setVisible(!is_zoomed);
-		mUnzoomCtrl->setVisible(has_focus && is_zoomed);
+		mUnzoomCtrl->setVisible(is_zoomed);
 		mOpenCtrl->setVisible(true);
 		mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
 		mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
@@ -332,13 +336,12 @@ void LLPanelPrimMediaControls::updateShape()
 
 		if(media_plugin && media_plugin->pluginSupportsMediaTime())
 		{
-			mReloadCtrl->setEnabled(FALSE);
-			mReloadCtrl->setVisible(FALSE);
+			mReloadCtrl->setEnabled(false);
+			mReloadCtrl->setVisible(false);
 			mMediaStopCtrl->setVisible(has_focus);
-			mHomeCtrl->setVisible(FALSE);
-			// No nav controls
-			mBackCtrl->setVisible(FALSE);
-			mFwdCtrl->setEnabled(FALSE);
+			mHomeCtrl->setVisible(has_focus);
+			mBackCtrl->setVisible(false);
+			mFwdCtrl->setVisible(false);
 			mMediaAddressCtrl->setVisible(false);
 			mMediaAddressCtrl->setEnabled(false);
 			mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
@@ -416,7 +419,6 @@ void LLPanelPrimMediaControls::updateShape()
 					mPlayCtrl->setVisible(FALSE);
 					mPauseCtrl->setEnabled(TRUE);
 					mPauseCtrl->setVisible(has_focus);
-					mMediaStopCtrl->setEnabled(TRUE);
 					
 					break;
 				case LLPluginClassMediaOwner::MEDIA_PAUSED:
@@ -425,7 +427,6 @@ void LLPanelPrimMediaControls::updateShape()
 					mPauseCtrl->setVisible(FALSE);
 					mPlayCtrl->setEnabled(TRUE);
 					mPlayCtrl->setVisible(has_focus);
-					mMediaStopCtrl->setEnabled(FALSE);
 					break;
 			}
 		}
@@ -508,12 +509,10 @@ void LLPanelPrimMediaControls::updateShape()
 			{	
 				mMediaProgressPanel->setVisible(true);
 				mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
-				gFocusMgr.setTopCtrl(mMediaProgressPanel);
 			}
-			else if (mMediaProgressPanel->getVisible())
+			else
 			{
 				mMediaProgressPanel->setVisible(false);
-				gFocusMgr.setTopCtrl(NULL);
 			}
 		}
 
@@ -599,12 +598,12 @@ void LLPanelPrimMediaControls::updateShape()
 		}
 
         LLCoordGL screen_min;
-		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (min.mV[VX] + 1.f) * 0.5f);
-		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (min.mV[VY] + 1.f) * 0.5f);
+		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (min.mV[VX] + 1.f) * 0.5f);
+		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (min.mV[VY] + 1.f) * 0.5f);
 
 		LLCoordGL screen_max;
-		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (max.mV[VX] + 1.f) * 0.5f);
-		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (max.mV[VY] + 1.f) * 0.5f);
+		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (max.mV[VX] + 1.f) * 0.5f);
+		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (max.mV[VY] + 1.f) * 0.5f);
 
 		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD
 		LLRect media_controls_rect;
@@ -613,14 +612,15 @@ void LLPanelPrimMediaControls::updateShape()
 		media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom;
 		media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop;
 		media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight;
-
-		LLRect old_hud_rect = media_controls_rect;
+		
 		// keep all parts of HUD on-screen
 		media_controls_rect.intersectWith(getParent()->getLocalRect());
+		if (mCurrentZoom != ZOOM_NONE)
+			media_controls_rect.mBottom -= mMediaControlsStack->getRect().getHeight() + mMediaProgressPanel->getRect().getHeight();
 
 		// clamp to minimum size, keeping centered
 		media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(),
-			llmax(MIN_HUD_WIDTH, media_controls_rect.getWidth()), llmax(MIN_HUD_HEIGHT, media_controls_rect.getHeight()));
+			llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight()));
 
 		setShape(media_controls_rect, true);
 
@@ -968,17 +968,17 @@ void LLPanelPrimMediaControls::updateZoom()
 		}
 	case ZOOM_FAR:
 		{
-			zoom_padding = ZOOM_FAR_PADDING;
+			zoom_padding = mZoomFarPadding;
 			break;
 		}
 	case ZOOM_MEDIUM:
 		{
-			zoom_padding = ZOOM_MEDIUM_PADDING;
+			zoom_padding = mZoomMediumPadding;
 			break;
 		}
 	case ZOOM_NEAR:
 		{
-			zoom_padding = ZOOM_NEAR_PADDING;
+			zoom_padding = mZoomNearPadding;
 			break;
 		}
 	default:
@@ -988,9 +988,16 @@ void LLPanelPrimMediaControls::updateZoom()
 		}
 	}
 
-	if (zoom_padding > 0.0f)		
+	if (zoom_padding > 0.0f)
+	{
 		LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding);
+	}
+	
+	// Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
+	mZoomObjectID = mTargetObjectID;
+	mZoomObjectFace = mTargetObjectFace;
 }
+
 void LLPanelPrimMediaControls::onScrollUp(void* user_data)
 {
 	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index accfb72a0494c5eb45b4875748c2bbd40c4b41e4..fe8f100abe8ec68a970dab55c37b92165ae16186 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -160,6 +160,11 @@ class LLPanelPrimMediaControls : public LLPanel
 	LLUICtrl *mRightBookend;
 	LLUIImage* mBackgroundImage;
 	F32 mSkipStep;
+	S32 mMinWidth;
+	S32 mMinHeight;
+	F32 mZoomNearPadding;
+	F32 mZoomMediumPadding;
+	F32 mZoomFarPadding;
 	
 	LLUICtrl *mMediaPanelScroll;
 	LLButton *mScrollUpCtrl;
@@ -190,6 +195,9 @@ class LLPanelPrimMediaControls : public LLPanel
 	S32 mTargetObjectFace;
 	LLUUID mTargetImplID;
 	LLVector3 mTargetObjectNormal;
+	
+	LLUUID mZoomObjectID;
+	S32 mZoomObjectFace;
 };
 
 #endif // LL_PANELPRIMMEDIACONTROLS_H
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index fd74c9c2fcad2a2436a15fbe4114bc06a0ad3fea..f639c841e70d00bd1d5fa441ca25ad6b75a81d17 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -138,15 +138,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 	}
 	else
 	{
-		if(mFocusedImplID.notNull())
-		{
-			if(mMediaControls.get())
-			{
-				// Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom.
-				mMediaControls.get()->resetZoomLevel(false);
-			}
-		}
-
 		if(hasFocus())
 		{
 			gFocusMgr.setKeyboardFocus(NULL);
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_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index af4c01185ae31f7d38a51cfff17cb99e254a5f92..8b86067b036eb8b22b9e2bc04e18e64b737edcc9 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -9,6 +9,11 @@
 	width="800">
   <string name="control_background_image_name">Inspector_Background</string>
   <string name="skip_step">0.2</string>
+  <string name="min_width">400</string>
+  <string name="min_height">120</string>
+  <string name="zoom_near_padding">1.0</string>
+  <string name="zoom_medium_padding">1.25</string>
+  <string name="zoom_far_padding">1.5</string>
   <panel
 	  name="media_region"
 	  bottom="125"
@@ -20,7 +25,7 @@
 	  name="media_controls"
 	  follows="left|right"
 	  animate="false"
-	  height="32"
+	  height="26"
 	  layout="topleft"
 	  left="0"
 	  orientation="horizontal"
@@ -235,18 +240,17 @@
 		width="190"
 		min_width="90">
 	  <!--
-		  RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN
-
-<combo_box
-name="media_address_url"
-allow_text_entry="true"
-height="22"
-layout="topleft"
-max_chars="1024"
-tool_tip = "Media URL"
-<combo_box.commit_callback
-function="MediaCtrl.CommitURL" />
-</combo_box>
+	  RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN
+	  <combo_box
+		  name="media_address_url"
+		  allow_text_entry="true"
+		  height="22"
+		  layout="topleft"
+		  max_chars="1024"
+		  tool_tip = "Media URL">
+		<combo_box.commit_callback
+			function="MediaCtrl.CommitURL" />
+	  </combo_box>
 	  -->
 	  <line_editor 
 		  name="media_address_url"
@@ -304,17 +308,17 @@ function="MediaCtrl.CommitURL" />
 		user_resize="false"
 		follows="left|right|top|bottom"
 		layout="topleft"
+		height="16"		
 		min_width="100"
 		width="200">
 	  <slider_bar
 		  name="media_play_slider"
 		  follows="left|right|top"
-		  height="22"
+		  height="16"
 		  increment="0.05"
 		  initial_value="0.5"
 		  layout="topleft"
 		  tool_tip="Movie play progress"
-		  top="8"
 		  min_width="100"
 		  width="200">
 		<slider_bar.commit_callback
@@ -619,7 +623,7 @@ function="MediaCtrl.CommitURL" />
   </layout_stack>
   <layout_stack
 	  follows="left|right|bottom"
-	  height="32"
+	  height="20"
 	  layout="topleft"
 	  animate="false"
 	  left="0"
@@ -632,7 +636,7 @@ function="MediaCtrl.CommitURL" />
 		user_resize="false" />
 	<panel
 		name="media_progress_indicator"
-		height="22"
+		height="20"
 		layout="topleft"
 		left="0"
 		top="0"
@@ -644,6 +648,7 @@ function="MediaCtrl.CommitURL" />
 		  name="media_progress_bar"
 		  color_bar="1 1 1 0.96"
 		  follows="left|right|top"
+		  top="5"
 		  height="8"
 		  layout="topleft"
 		  left="0"