diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index aca0e1d5c7e6f62b3b7189b015eca869364424a0..529912929d6274699058686226d411b07c0d4a8e 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -782,8 +782,8 @@ void LLPanelPrimMediaControls::onClickClose()
 
 void LLPanelPrimMediaControls::close()
 {
+	resetZoomLevel(true);
 	LLViewerMediaFocus::getInstance()->clearFocus();
-	resetZoomLevel();
 	setVisible(FALSE);
 }
 
@@ -921,8 +921,11 @@ void LLPanelPrimMediaControls::onClickSkipForward()
 void LLPanelPrimMediaControls::onClickZoom()
 {
 	focusOnTarget();
-
-	nextZoomLevel();
+	
+	if(mCurrentZoom == ZOOM_NONE)
+	{
+		nextZoomLevel();
+	}
 }
 
 void LLPanelPrimMediaControls::nextZoomLevel()
@@ -941,12 +944,15 @@ void LLPanelPrimMediaControls::nextZoomLevel()
 	updateZoom();
 }
 
-void LLPanelPrimMediaControls::resetZoomLevel()
+void LLPanelPrimMediaControls::resetZoomLevel(bool reset_camera)
 {
 	if(mCurrentZoom != ZOOM_NONE)
 	{
 		mCurrentZoom = ZOOM_NONE;
-		updateZoom();
+		if(reset_camera)
+		{
+			updateZoom();
+		}
 	}
 }
 
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 54fc4e343fc96b4da051ecc9197898d6555a6310..accfb72a0494c5eb45b4875748c2bbd40c4b41e4 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -58,7 +58,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	void updateShape();
 	bool isMouseOver();
 	void nextZoomLevel();
-	void resetZoomLevel();
+	void resetZoomLevel(bool reset_camera = true);
 	void close();
 
 	LLHandle<LLPanelPrimMediaControls>	getHandle() const { return mPanelHandle; }
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index 70a7d835a36da1b256496b40a771f60a7a78cf32..fd74c9c2fcad2a2436a15fbe4114bc06a0ad3fea 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -120,10 +120,20 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 		// We must do this before  processing the media HUD zoom, or it may zoom to the wrong face. 
 		update();
 
-		if(mMediaControls.get() && face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
+		if(mMediaControls.get())
 		{
-			mMediaControls.get()->resetZoomLevel();
-			mMediaControls.get()->nextZoomLevel();
+			if(face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
+			{
+				// Zoom in on this face
+				mMediaControls.get()->resetZoomLevel();
+				mMediaControls.get()->nextZoomLevel();
+			}
+			else
+			{
+				// Reset the controls' zoom level without moving the camera.
+				// This fixes the case where clicking focus between two non-autozoom faces doesn't change the zoom-out button back to a zoom-in button.
+				mMediaControls.get()->resetZoomLevel(false);
+			}
 		}
 	}
 	else
@@ -132,7 +142,8 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 		{
 			if(mMediaControls.get())
 			{
-				mMediaControls.get()->resetZoomLevel();
+				// Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom.
+				mMediaControls.get()->resetZoomLevel(false);
 			}
 		}
 
@@ -292,6 +303,15 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
 
 		if (key == KEY_ESCAPE)
 		{
+			// Reset camera zoom in this case.
+			if(mFocusedImplID.notNull())
+			{
+				if(mMediaControls.get())
+				{
+					mMediaControls.get()->resetZoomLevel(true);
+				}
+			}
+			
 			clearFocus();
 		}
 	}