diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index e5a2385a2a6d16330cd503f411e435f20b46f385..022c191a655c3b861ecf495f0c9a38af8fb55ef9 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -6236,6 +6236,14 @@ void LLViewerObject::parameterChanged(U16 param_type, LLNetworkData* data, BOOL
 			LL_WARNS() << "Failed to send object extra parameters: " << param_type << LL_ENDL;
 		}
 	}
+    else
+    {
+        if (param_type == LLNetworkData::PARAMS_RENDER_MATERIAL)
+        {
+            const LLRenderMaterialParams* params = in_use ? (LLRenderMaterialParams*)getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL) : nullptr;
+            setRenderMaterialIDs(params, local_origin);
+        }
+    }
 }
 
 void LLViewerObject::setDrawableState(U32 state, BOOL recursive)
@@ -7103,6 +7111,29 @@ void LLViewerObject::setRenderMaterialID(U8 te, const LLUUID& id)
     }
 }
 
+void LLViewerObject::setRenderMaterialIDs(const LLRenderMaterialParams* material_params, bool local_origin)
+{
+    if (!local_origin)
+    {
+        const S32 num_tes = llmin((S32)getNumTEs(), (S32)getNumFaces()); // avatars have TEs but no faces
+        for (S32 te = 0; te < num_tes; ++te)
+        {
+            const LLUUID& id = material_params ? material_params->getMaterial(te) : LLUUID::null;
+            if (id.notNull())
+            {
+                getTE(te)->setGLTFMaterial(gGLTFMaterialList.getMaterial(id));
+                setHasRenderMaterialParams(true);
+            }
+            else
+            {
+                getTE(te)->setGLTFMaterial(nullptr);
+            }
+        }
+        faceMappingChanged();
+        gPipeline.markTextured(mDrawable);
+    }
+}
+
 class ObjectPhysicsProperties : public LLHTTPNode
 {
 public:
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 109c96dc9ca7f542569015af5c9eb7d04e925b8e..680cfb9639e8ff701dc7cf0fa4cc23d03303a964 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -185,6 +185,7 @@ class LLViewerObject
 
     const LLUUID& getRenderMaterialID(U8 te) const;
     void setRenderMaterialID(U8 te, const LLUUID& id);
+    void setRenderMaterialIDs(const LLRenderMaterialParams* material_params, bool local_origin);
 
 	virtual BOOL	isHUDAttachment() const { return FALSE; }
 	virtual BOOL	isTempAttachment() const;