diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 6c99f648dec5ed3074e914bfb90d6576b2d1eb3d..9c5de18a35c2e3f069f8945a47a010a2736f3169 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -1192,7 +1192,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 		{
 			if (gDebugGL)
 			{
-                llassert(false);
 				LL_WARNS()	<< "Index buffer overflow!" << LL_ENDL;
 				LL_WARNS() << "Indices Count: " << mIndicesCount
 						<< " VF Num Indices: " << num_indices
@@ -1200,6 +1199,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 						<< " VB Num Indices: " << mVertexBuffer->getNumIndices() << LL_ENDL;
 				LL_WARNS()	<< " Face Index: " << f
 						<< " Pool Type: " << mPoolType << LL_ENDL;
+				llassert(false);
 			}
 			return FALSE;
 		}
@@ -1208,8 +1208,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 		{
 			if (gDebugGL)
 			{
-                llassert(false);
 				LL_WARNS() << "Vertex buffer overflow!" << LL_ENDL;
+				llassert(false);
 			}
 			return FALSE;
 		}
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 2f42067a518ad709662140cee39c9c978d5acea7..9c8a97eed1b52390fbf74795aac8f0766096e765 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -1204,10 +1204,16 @@ bool LLMaterialEditor::saveIfNeeded()
     }
     else
     { 
-        //make a new inventory item
-        std::string res_desc = buildMaterialDescription();
+        // Make a new inventory item and set upload permissions
         LLPermissions local_permissions;
         local_permissions.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+
+        U32 everyone_perm = LLFloaterPerms::getEveryonePerms("Materials");
+        U32 group_perm = LLFloaterPerms::getGroupPerms("Materials");
+        U32 next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Materials");
+        local_permissions.initMasks(PERM_ALL, PERM_ALL, everyone_perm, group_perm, next_owner_perm);
+
+        std::string res_desc = buildMaterialDescription();
         createInventoryItem(buffer, mMaterialName, res_desc, local_permissions);
 
         // We do not update floater with uploaded asset yet, so just close it.
@@ -1954,6 +1960,32 @@ bool LLMaterialEditor::canSaveObjectsMaterial()
     return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), permissions, item_out);
 }
 
+bool LLMaterialEditor::canClipboardObjectsMaterial()
+{
+    if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() != 1)
+    {
+        return false;
+    }
+
+    struct LLSelectedTEGetNullMat : public LLSelectedTEFunctor
+    {
+        bool apply(LLViewerObject* objectp, S32 te_index)
+        {
+            return objectp->getRenderMaterialID(te_index).isNull();
+        }
+    } null_func;
+
+    if (LLSelectMgr::getInstance()->getSelection()->applyToTEs(&null_func))
+    {
+        return true;
+    }
+
+    LLSelectedTEGetMatData func(true);
+    LLPermissions permissions;
+    LLViewerInventoryItem* item_out;
+    return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), permissions, item_out);
+}
+
 void LLMaterialEditor::saveObjectsMaterialAs()
 {
     LLSelectedTEGetMatData func(true);
diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h
index 6b2f49e2fc6697cdce086e977049ce5671a0eeae..b29db706f819c93a01f3d59582c0471b3f8a4256 100644
--- a/indra/newview/llmaterialeditor.h
+++ b/indra/newview/llmaterialeditor.h
@@ -115,6 +115,7 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener
 
     static bool canModifyObjectsMaterial();
     static bool canSaveObjectsMaterial();
+    static bool canClipboardObjectsMaterial();
     static void saveObjectsMaterialAs();
     static void onCopyObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response, const LLPermissions& permissions, const LLUUID& object_id, const LLUUID& item_id);
     static void onSaveObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response, const LLPermissions& permissions);
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 39dba3e3444c75874f91f3e22e0f75bff22fd3d7..8e4acb508f1d020eff67acd9f2c0f28902ed768d 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1921,7 +1921,8 @@ void LLPanelFace::updateCopyTexButton()
     LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
     mMenuClipboardTexture->setEnabled(objectp && objectp->getPCode() == LL_PCODE_VOLUME && objectp->permModify() 
                                                     && !objectp->isPermanentEnforced() && !objectp->isInventoryPending() 
-                                                    && (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1));
+                                                    && (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)
+                                                    && LLMaterialEditor::canClipboardObjectsMaterial());
     std::string tooltip = (objectp && objectp->isInventoryPending()) ? LLTrans::getString("LoadingContents") : getString("paste_options");
     mMenuClipboardTexture->setToolTip(tooltip);
 }
@@ -4054,7 +4055,8 @@ void LLPanelFace::onCopyTexture()
         || objectp->getPCode() != LL_PCODE_VOLUME
         || !objectp->permModify()
         || objectp->isPermanentEnforced()
-        || selected_count > 1)
+        || selected_count > 1
+        || !LLMaterialEditor::canClipboardObjectsMaterial())
     {
         return;
     }
@@ -4249,7 +4251,8 @@ void LLPanelFace::onPasteTexture()
         || objectp->getPCode() != LL_PCODE_VOLUME
         || !objectp->permModify()
         || objectp->isPermanentEnforced()
-        || selected_count > 1)
+        || selected_count > 1
+        || !LLMaterialEditor::canClipboardObjectsMaterial())
     {
         // not supposed to happen
         LL_WARNS() << "Failed to paste texture due to missing or wrong selection" << LL_ENDL;