diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 9c80d582d5da7dd1a81aaf3eff0e07384a977d7b..9eb491ef3af00247a03fdfb6de021d341e931adc 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -2912,6 +2912,7 @@ void LLPanelFace::onCopyFaces()
             {
                 LLSD te_data;
 
+                // asLLSD() includes media
                 te_data["te"] = tep->asLLSD();
                 te_data["te"]["glow"] = tep->getGlow();
                 te_data["te"]["shiny"] = tep->getShiny();
@@ -3002,8 +3003,6 @@ void LLPanelFace::onCopyFaces()
                     te_data["material"] = mat_data;
                 }
 
-                //*TODO: Media
-
                 mClipboard.append(te_data);
             }
         }
@@ -3116,7 +3115,7 @@ void LLPanelFace::pasteFace(LLViewerObject* objectp, S32 te)
             // Color / Alpha
             if ((mPasteColor || mPasteAlpha) && te_data["te"].has("colors"))
             {
-                LLColor4 color = objectp->getTE(te)->getColor();
+                LLColor4 color = tep->getColor();
 
                 LLColor4 clip_color;
                 clip_color.setValue(te_data["te"]["colors"]);
@@ -3167,19 +3166,20 @@ void LLPanelFace::pasteFace(LLViewerObject* objectp, S32 te)
                 }
             }
 
-           // Media
-            if (mPasteMedia && te_data.has("media")) //te_data["te"]?
+            // Media
+            if (mPasteMedia && te_data["te"].has("media_flags"))
             {
-                //*TODO
+                U8 media_flags = te_data["te"]["media_flags"].asInteger();
+                objectp->setTEMediaFlags(te, media_flags);
+                LLVOVolume *vo = dynamic_cast<LLVOVolume*>(objectp);
+                if (vo && te_data["te"].has(LLTextureEntry::TEXTURE_MEDIA_DATA_KEY))
+                {
+                    vo->syncMediaData(te, te_data["te"][LLTextureEntry::TEXTURE_MEDIA_DATA_KEY], true/*merge*/, true/*ignore_agent*/);
+                }
             }
             else
             {
-                // // Keep media flags on destination unchanged
-                // // Media is handled later
-                // if (te_data["te"].has("media_flags"))
-                // {
-                    // te_data["te"]["media_flags"] = tep->getMediaTexGen();
-                // }
+                // Keep media flags on destination unchanged
             }
         }
 
@@ -3261,13 +3261,66 @@ struct LLPanelFacePasteTexFunctor : public LLSelectedTEFunctor
     LLPanelFace *mPanelFace;
 };
 
+struct LLPanelFaceUpdateFunctor : public LLSelectedObjectFunctor
+{
+    LLPanelFaceUpdateFunctor(bool update_media) : mUpdateMedia(update_media) {}
+    virtual bool apply(LLViewerObject* object)
+    {
+        object->sendTEUpdate();
+        if (mUpdateMedia)
+        {
+            LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object);
+            if (vo && vo->hasMedia())
+            {
+                vo->sendMediaDataUpdate();
+            }
+        }
+        return true;
+    }
+private:
+    bool mUpdateMedia;
+};
+
+struct LLPanelFaceNavigateHomeFunctor : public LLSelectedTEFunctor
+{
+    virtual bool apply(LLViewerObject* objectp, S32 te)
+    {
+        if (objectp && objectp->getTE(te))
+        {
+            LLTextureEntry* tep = objectp->getTE(te);
+            const LLMediaEntry *media_data = tep->getMediaData();
+            if (media_data)
+            {
+                if (media_data->getCurrentURL().empty() && media_data->getAutoPlay())
+                {
+                    viewer_media_t media_impl =
+                        LLViewerMedia::getMediaImplFromTextureID(tep->getMediaData()->getMediaID());
+                    if (media_impl)
+                    {
+                        media_impl->navigateHome();
+                    }
+                }
+            }
+        }
+        return true;
+    }
+};
+
 void LLPanelFace::onPasteFaces()
 {
+    LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
+
     LLPanelFacePasteTexFunctor paste_func(this);
-    LLSelectMgr::getInstance()->getSelection()->applyToTEs(&paste_func);
+    selected_objects->applyToTEs(&paste_func);
+
+    LLPanelFaceUpdateFunctor sendfunc(mPasteMedia);
+    selected_objects->applyToObjects(&sendfunc);
 
-    LLPanelFaceSendFunctor sendfunc;
-    LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc);
+    if (mPasteMedia)
+    {
+        LLPanelFaceNavigateHomeFunctor navigate_home_func;
+        selected_objects->applyToTEs(&navigate_home_func);
+    }
 }
 
 bool LLPanelFace::pasteCheckMenuItem(const LLSD& userdata)