diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index d61bd680df14e05ffc909908a06bb651cf986e33..84fe83408fcbf05982d7851c91eceb7cbad389ba 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -100,6 +100,12 @@ class MediaPluginCEF :
 	LLCEFLib* mLLCEFLib;
 
     VolumeCatcher mVolumeCatcher;
+
+	U8 *mPopupBuffer;
+	U32 mPopupW;
+	U32 mPopupH;
+	U32 mPopupX;
+	U32 mPopupY;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -127,12 +133,19 @@ MediaPluginBase(host_send_func, host_user_data)
 	mCookiePath = "";
 	mPickedFile = "";
 	mLLCEFLib = new LLCEFLib();
+
+	mPopupBuffer = NULL;
+	mPopupW = 0;
+	mPopupH = 0;
+	mPopupX = 0;
+	mPopupY = 0;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 //
 MediaPluginCEF::~MediaPluginCEF()
 {
+	delete[] mPopupBuffer;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -155,20 +168,28 @@ void MediaPluginCEF::postDebugMessage(const std::string& msg)
 //
 void MediaPluginCEF::onPageChangedCallback(unsigned char* pixels, int x, int y, int width, int height, bool is_popup)
 {
-	if (mPixels && pixels)
+	if( is_popup )
+	{
+		delete mPopupBuffer;
+		mPopupBuffer = NULL;
+		mPopupH = 0;
+		mPopupW = 0;
+		mPopupX = 0;
+		mPopupY = 0;
+	}
+
+	if( mPixels && pixels )
 	{
 		if (is_popup)
 		{
-			for (int line = 0; line < height; ++line)
+			if( width > 0 && height> 0 )
 			{
-				int inverted_y = mHeight - y - height;
-				int src = line * width * mDepth;
-				int dst = (inverted_y + line) * mWidth * mDepth + x * mDepth;
-
-				if (dst + width * mDepth < mWidth * mHeight * mDepth)
-				{
-					memcpy(mPixels + dst, pixels + src, width * mDepth);
-				}
+				mPopupBuffer = new U8[ width * height * mDepth ];
+				memcpy( mPopupBuffer, pixels, width * height * mDepth );
+				mPopupH = height;
+				mPopupW = width;
+				mPopupX = x;
+				mPopupY = y;
 			}
 		}
 		else
@@ -177,6 +198,23 @@ void MediaPluginCEF::onPageChangedCallback(unsigned char* pixels, int x, int y,
 			{
 				memcpy(mPixels, pixels, mWidth * mHeight * mDepth);
 			}
+			if( mPopupBuffer && mPopupH && mPopupW )
+			{
+				U32 bufferSize = mWidth * mHeight * mDepth;
+				U32 popupStride = mPopupW * mDepth;
+				U32 bufferStride = mWidth * mDepth;
+				int dstY = mPopupY;
+
+				int src = 0;
+				int dst = dstY  * mWidth * mDepth + mPopupX * mDepth;
+
+				for( int line = 0; dst + popupStride < bufferSize && line < mPopupH; ++line )
+				{
+					memcpy( mPixels + dst, mPopupBuffer + src, popupStride );
+					src += popupStride;
+					dst += bufferStride;
+				}
+			}
 
 		}
 		setDirty(0, 0, mWidth, mHeight);