diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 12d21cf284bc9595cd94553a7e4bebd257bc5ecc..a0ab771c7b6ae6b72aba8b521db1ce903805f61f 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -149,6 +149,8 @@ BOOL LLMaterialEditor::postBuild()
 
     childSetVisible("unsaved_changes", mHasUnsavedChanges);
 
+    getChild<LLUICtrl>("total_upload_fee")->setTextArg("[FEE]", llformat("%d", 0));
+
     // Todo:
     // Disable/enable setCanApplyImmediately() based on
     // working from inventory, upload or editing inworld
@@ -391,16 +393,43 @@ void LLMaterialEditor::setHasUnsavedChanges(bool value)
     getChild<LLUICtrl>("total_upload_fee")->setTextArg("[FEE]", llformat("%d", mExpectedUploadCost));
 }
 
-void LLMaterialEditor::setCanSaveAs(BOOL value)
+void LLMaterialEditor::setCanSaveAs(bool value)
 {
     childSetEnabled("save_as", value);
 }
 
-void LLMaterialEditor::setCanSave(BOOL value)
+void LLMaterialEditor::setCanSave(bool value)
 {
     childSetEnabled("save", value);
 }
 
+void LLMaterialEditor::setEnableEditing(bool can_modify)
+{
+    childSetEnabled("double sided", can_modify);
+
+    // BaseColor
+    childSetEnabled("base color", can_modify);
+    childSetEnabled("transparency", can_modify);
+    childSetEnabled("alpha mode", can_modify);
+    childSetEnabled("alpha cutoff", can_modify);
+
+    // Metallic-Roughness
+    childSetEnabled("metalness factor", can_modify);
+    childSetEnabled("roughness factor", can_modify);
+
+    // Metallic-Roughness
+    childSetEnabled("metalness factor", can_modify);
+    childSetEnabled("roughness factor", can_modify);
+
+    // Emissive
+    childSetEnabled("emissive color", can_modify);
+
+    mBaseColorTextureCtrl->setEnabled(can_modify);
+    mMetallicTextureCtrl->setEnabled(can_modify);
+    mEmissiveTextureCtrl->setEnabled(can_modify);
+    mNormalTextureCtrl->setEnabled(can_modify);
+}
+
 void LLMaterialEditor::onCommitBaseColorTexture(LLUICtrl * ctrl, const LLSD & data)
 {
     // might be better to use arrays, to have a single callback
@@ -1624,6 +1653,7 @@ void LLMaterialEditor::loadAsset()
                 mAssetStatus = PREVIEW_ASSET_LOADED;
                 loadDefaults();
                 setHasUnsavedChanges(false);
+                setEnableEditing(allow_modify && !source_library);
             }
             else
             {
@@ -1644,6 +1674,7 @@ void LLMaterialEditor::loadAsset()
                         mAssetID.setNull();
                         mAssetStatus = PREVIEW_ASSET_LOADED;
                         setHasUnsavedChanges(false);
+                        setEnableEditing(allow_modify && !source_library);
                         return;
                     }
                     user_data->with("taskid", mObjectUUID).with("itemid", mItemUUID);
@@ -1653,6 +1684,8 @@ void LLMaterialEditor::loadAsset()
                     user_data = new LLSD(mItemUUID);
                 }
 
+                setEnableEditing(false); // wait for it to load
+
                 gAssetStorage->getInvItemAsset(source_sim,
                     gAgent.getID(),
                     gAgent.getSessionID(),
@@ -1724,8 +1757,9 @@ void LLMaterialEditor::onLoadComplete(const LLUUID& asset_uuid,
 
             editor->decodeAsset(buffer);
 
-            BOOL modifiable = editor->canModify(editor->mObjectID, editor->getItem());
-            editor->setEnabled(modifiable);
+            BOOL allow_modify = editor->canModify(editor->mObjectID, editor->getItem());
+            BOOL source_library = editor->mObjectID.isNull() && gInventory.isObjectDescendentOf(editor->mItemUUID, gInventory.getLibraryRootFolderID());
+            editor->setEnableEditing(allow_modify && !source_library);
             editor->setHasUnsavedChanges(false);
             editor->mAssetStatus = PREVIEW_ASSET_LOADED;
         }
@@ -1744,6 +1778,7 @@ void LLMaterialEditor::onLoadComplete(const LLUUID& asset_uuid,
             {
                 LLNotificationsUtil::add("UnableToLoadMaterial");
             }
+            editor->setEnableEditing(false);
 
             LL_WARNS() << "Problem loading material: " << status << LL_ENDL;
             editor->mAssetStatus = PREVIEW_ASSET_ERROR;
diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h
index 0d741614b8829b960561aed0483c18ac12df9921..8a67c3c3484ed357b0591cc3dba3f033cb9bcc4a 100644
--- a/indra/newview/llmaterialeditor.h
+++ b/indra/newview/llmaterialeditor.h
@@ -153,8 +153,9 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener
     void setDoubleSided(bool double_sided);
 
     void setHasUnsavedChanges(bool value);
-    void setCanSaveAs(BOOL value);
-    void setCanSave(BOOL value);
+    void setCanSaveAs(bool value);
+    void setCanSave(bool value);
+    void setEnableEditing(bool can_modify);
 
     void onCommitBaseColorTexture(LLUICtrl* ctrl, const LLSD& data);
     void onCommitMetallicTexture(LLUICtrl* ctrl, const LLSD& data);