diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 32fb33f734c5ff44e7ae3ec6bed366b0756222f9..971a8b850fe9b06a5f3ec3f6ab65c84b37f3544e 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -834,8 +834,32 @@ void LLPanelPrimMediaControls::draw()
 
 BOOL LLPanelPrimMediaControls::handleScrollWheel(S32 x, S32 y, S32 clicks)
 {
-	mInactivityTimer.start();
-	return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks);
+    mInactivityTimer.start();
+    BOOL res = FALSE;
+
+    // Unlike other mouse events, we need to handle scroll here otherwise
+    // it will be intercepted by camera and won't reach toolpie
+    if (LLViewerMediaFocus::getInstance()->isHoveringOverFocused())
+    {
+        // either let toolpie handle this or expose mHoverPick.mUVCoords in some way
+        res = LLToolPie::getInstance()->handleScrollWheel(x, y, clicks);
+    }
+
+    return res;
+}
+
+BOOL LLPanelPrimMediaControls::handleScrollHWheel(S32 x, S32 y, S32 clicks)
+{
+    mInactivityTimer.start();
+    BOOL res = FALSE;
+
+    if (LLViewerMediaFocus::getInstance()->isHoveringOverFocused())
+    {
+        // either let toolpie handle this or expose mHoverPick.mUVCoords in some way
+        res = LLToolPie::getInstance()->handleScrollHWheel(x, y, clicks);
+    }
+
+    return res;
 }
 
 BOOL LLPanelPrimMediaControls::handleMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 21d52360744d7e53c0f4847bccb14efb3029a5b7..d4301aaf7ccbddb157114cba9e39ef30d4830d65 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -48,6 +48,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	/*virtual*/ BOOL postBuild();
 	virtual void draw();
 	virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
+	virtual BOOL handleScrollHWheel(S32 x, S32 y, S32 clicks);
 
 	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 9de21d01b7fc9e9e02147be0728463b292fdccec..1137d1441694bac758a44d2935e4124131718e4e 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -207,14 +207,31 @@ BOOL LLToolPie::handleRightMouseUp(S32 x, S32 y, MASK mask)
 	return LLTool::handleRightMouseUp(x, y, mask);
 }
 
+BOOL LLToolPie::handleScrollWheelAny(S32 x, S32 y, S32 clicks_x, S32 clicks_y)
+{
+    BOOL res = FALSE;
+    // mHoverPick should have updated on its own and we should have a face
+    // in LLViewerMediaFocus in case of media, so just reuse mHoverPick
+    if (mHoverPick.mUVCoords.mV[VX] >= 0.f && mHoverPick.mUVCoords.mV[VY] >= 0.f)
+    {
+        res = LLViewerMediaFocus::getInstance()->handleScrollWheel(mHoverPick.mUVCoords, clicks_x, clicks_y);
+    }
+    else
+    {
+        // this won't provide correct coordinates in case of object selection
+        res = LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks_x, clicks_y);
+    }
+    return res;
+}
+
 BOOL LLToolPie::handleScrollWheel(S32 x, S32 y, S32 clicks)
 {
-	return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks);
+    return handleScrollWheelAny(x, y, 0, clicks);
 }
 
 BOOL LLToolPie::handleScrollHWheel(S32 x, S32 y, S32 clicks)
 {
-    return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks);
+    return handleScrollWheelAny(x, y, clicks, 0);
 }
 
 // True if you selected an object.
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 373694443ffc195cfdb52408b168148ef2e93fd5..8b776904a2aa588f38c9cae0f50c458196c9c669 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -49,6 +49,7 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 	virtual BOOL		handleRightMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL		handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL		handleDoubleClick(S32 x, S32 y, MASK mask);
+	BOOL				handleScrollWheelAny(S32 x, S32 y, S32 clicks_x, S32 clicks_y);
 	virtual BOOL		handleScrollWheel(S32 x, S32 y, S32 clicks);
 	virtual BOOL		handleScrollHWheel(S32 x, S32 y, S32 clicks);
 	virtual BOOL		handleToolTip(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index be7615a763855f1f73d42dabd3ad098b656344dc..3b08a59b4ba00279eec657f2818cc32b40f89c21 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -2298,6 +2298,18 @@ void LLViewerMediaImpl::mouseDoubleClick(S32 x, S32 y, MASK mask, S32 button)
 	}
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::scrollWheel(const LLVector2& texture_coords, S32 scroll_x, S32 scroll_y, MASK mask)
+{
+    if (mMediaSource)
+    {
+        S32 x, y;
+        scaleTextureCoords(texture_coords, &x, &y);
+
+        scrollWheel(x, y, scroll_x, scroll_y, mask);
+    }
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 void LLViewerMediaImpl::scrollWheel(S32 x, S32 y, S32 scroll_x, S32 scroll_y, MASK mask)
 {
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 9467a138f03733227dcbcf4b401b1d6fb32cbfe4..512c5a827992dca4d376b82f96362210b61fa408 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -235,6 +235,7 @@ class LLViewerMediaImpl
 	void mouseMove(const LLVector2& texture_coords, MASK mask);
     void mouseDoubleClick(const LLVector2& texture_coords, MASK mask);
     void mouseDoubleClick(S32 x, S32 y, MASK mask, S32 button = 0);
+	void scrollWheel(const LLVector2& texture_coords, S32 scroll_x, S32 scroll_y, MASK mask);
 	void scrollWheel(S32 x, S32 y, S32 scroll_x, S32 scroll_y, MASK mask);
 	void mouseCapture();
 	
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index 69ab0a71af459ecc9abe6e44ddd16faac300ddb4..71ae7bfbc3bccecbc0a60df8106729edd0b7d2ec 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -371,13 +371,26 @@ BOOL LLViewerMediaFocus::handleUnicodeChar(llwchar uni_char, BOOL called_from_pa
 		media_impl->handleUnicodeCharHere(uni_char);
 	return true;
 }
-BOOL LLViewerMediaFocus::handleScrollWheel(S32 x, S32 y, S32 clicks)
+
+BOOL LLViewerMediaFocus::handleScrollWheel(const LLVector2& texture_coords, S32 clicks_x, S32 clicks_y)
+{
+    BOOL retval = FALSE;
+    LLViewerMediaImpl* media_impl = getFocusedMediaImpl();
+    if (media_impl && media_impl->hasMedia())
+    {
+        media_impl->scrollWheel(texture_coords, clicks_x, clicks_y, gKeyboard->currentMask(TRUE));
+        retval = TRUE;
+    }
+    return retval;
+}
+
+BOOL LLViewerMediaFocus::handleScrollWheel(S32 x, S32 y, S32 clicks_x, S32 clicks_y)
 {
 	BOOL retval = FALSE;
 	LLViewerMediaImpl* media_impl = getFocusedMediaImpl();
 	if(media_impl && media_impl->hasMedia())
 	{
-		media_impl->scrollWheel(x, y, 0, clicks, gKeyboard->currentMask(TRUE));
+		media_impl->scrollWheel(x, y, clicks_x, clicks_y, gKeyboard->currentMask(TRUE));
 		retval = TRUE;
 	}
 	return retval;
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index 763a6c16881fb27d3f77fd37bea867de64a24364..fa469c36e3a1f5c81361951538816730c1103eee 100644
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -58,7 +58,8 @@ class LLViewerMediaFocus :
 	/*virtual*/ BOOL	handleKey(KEY key, MASK mask, BOOL called_from_parent);
 	/*virtual*/ BOOL	handleKeyUp(KEY key, MASK mask, BOOL called_from_parent);
 	/*virtual*/ BOOL	handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
-	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
+	BOOL handleScrollWheel(const LLVector2& texture_coords, S32 clicks_x, S32 clicks_y);
+	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks_x, S32 clicks_y);
 
 	void update();
 	
@@ -67,7 +68,8 @@ class LLViewerMediaFocus :
 
 	bool isFocusedOnFace(LLPointer<LLViewerObject> objectp, S32 face);
 	bool isHoveringOverFace(LLPointer<LLViewerObject> objectp, S32 face);
-	
+	bool isHoveringOverFocused() { return mFocusedObjectID == mHoverObjectID && mFocusedObjectFace == mHoverObjectFace; };
+
 	// These look up (by uuid) and return the values that were set with setFocusFace.  They will return null if the objects have been destroyed.
 	LLViewerMediaImpl* getFocusedMediaImpl();
 	LLViewerObject* getFocusedObject();