diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index e67750af7cc16b71bde8679210d82152d302aabd..004674997b2cc81db69af636b122fc517eb59405 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -1269,7 +1269,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
 				LL_INFOS() << "Full:" << getID() << LL_ENDL;
 #endif
 				//clear cost and linkset cost
-				mCostStale = true;
+				setObjectCostStale();
 				if (isSelected())
 				{
 					gFloaterTools->dirty();
@@ -1825,7 +1825,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
 #ifdef DEBUG_UPDATE_TYPE
 				LL_INFOS() << "CompFull:" << getID() << LL_ENDL;
 #endif
-				mCostStale = true;
+				setObjectCostStale();
 
 				if (isSelected())
 				{
@@ -3779,6 +3779,16 @@ void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped)
 	}
 }
 
+void LLViewerObject::setObjectCostStale()
+{
+	mCostStale = true;
+    // *NOTE: This is harmlessly redundant for Blinn-Phong material updates, as
+    // the root prim currently gets set stale anyway due to other property
+    // updates. But it is needed for GLTF material ID updates.
+    // -Cosmic,2023-06-27
+    getRootEdit()->mCostStale = true;
+}
+
 void LLViewerObject::setObjectCost(F32 cost)
 {
 	mObjectCost = cost;
@@ -6796,7 +6806,7 @@ void LLViewerObject::setPhysicsShapeType(U8 type)
 	if (type != mPhysicsShapeType)
 	{
 	mPhysicsShapeType = type;
-	mCostStale = true;
+	setObjectCostStale();
 }
 }
 
@@ -7303,6 +7313,12 @@ void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool updat
             LLGLTFMaterialList::queueApply(this, te, id);
         }
     }
+
+    if (!update_server)
+    {
+        // Land impact may have changed
+        setObjectCostStale();
+    }
 }
 
 void LLViewerObject::setRenderMaterialIDs(const LLUUID& id)
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index bf82c43cd35bd2f265f55a05281f6c74ad56b595..3665c64965408acc8755e2d03171deae9c74b990 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -637,6 +637,7 @@ class LLViewerObject
 	std::vector<LLVector3> mUnselectedChildrenPositions ;
 
 private:
+    void setObjectCostStale();
     bool isAssetInInventory(LLViewerInventoryItem* item);
 
 	ExtraParameter* createNewParameterEntry(U16 param_type);