diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 4f37b98dfcd8c320297b0687421cd161cea9e4ec..7abd2eb1588eea1102c486b7d8b3ce2573630fcb 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -52,7 +52,7 @@ std::string model_names[] =
 
 const int MODEL_NAMES_LENGTH = sizeof(model_names) / sizeof(std::string);
 
-LLModel::LLModel(LLVolumeParams& params, F32 detail)
+LLModel::LLModel(const LLVolumeParams& params, F32 detail)
     : LLVolume(params, detail),
       mNormalizedScale(1,1,1),
       mNormalizedTranslation(0, 0, 0),
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index 91ddbc69b63e335cc12919be07d36c767e975d80..3c828d11b7e95fb74866184bee399d375251a688 100644
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -152,7 +152,7 @@ class LLModel final : public LLVolume
         LLModel::PhysicsMesh mPhysicsShapeMesh;
     };
 
-    LLModel(LLVolumeParams& params, F32 detail);
+	LLModel(const LLVolumeParams& params, F32 detail);
     ~LLModel();
 
     bool loadModel(std::istream& is);
@@ -376,7 +376,7 @@ class LLModelInstanceBase
     LLMatrix4 mTransform;
     material_map mMaterial;
 
-    LLModelInstanceBase(LLModel* model, LLMatrix4& transform, material_map& materials)
+	LLModelInstanceBase(LLModel* model, const LLMatrix4& transform, const material_map& materials)
         : mModel(model), mTransform(transform), mMaterial(materials)
     {
     }
@@ -405,7 +405,7 @@ class LLModelInstance final : public LLModelInstanceBase
     LLUUID mMeshID;
     S32 mLocalMeshID;
 
-    LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, material_map& materials)
+	LLModelInstance(LLModel* model, const std::string& label, const LLMatrix4& transform, const material_map& materials)
         : LLModelInstanceBase(model, transform, materials), mLabel(label)
     {
         mLocalMeshID = -1;
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index 6c646f5b8c08608893824d7002a8c216d4741b64..98e70d76cffd0f131e2c050c177645eb4a6277b4 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -69,6 +69,8 @@
 #include "lltabcontainer.h"
 #include "lltextbox.h"
 
+#include <filesystem>
+
 #include <boost/algorithm/string.hpp>
 
 bool LLModelPreview::sIgnoreLoadedCallback = false;
@@ -1069,6 +1071,29 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
     { //only replace given LoD
         mModel[loaded_lod] = mModelLoader->mModelList;
         mScene[loaded_lod] = mModelLoader->mScene;
+
+        // Duplicate the model if it is an internal bounding box model
+        if (loaded_lod == LLModel::LOD_PHYSICS &&
+            mBaseModel.size() > 1 && // This makes sense for multiple models only
+            mModelLoader->mModelList.size() == 1 && // Just on the off-chance
+            mModelLoader->mScene.size() == 1 &&     // Just on the off-chance
+            std::filesystem::path(mModelLoader->mFilename).filename() == "cube.dae")
+        {
+            // Create a copy of the just loaded model for each model in mBaseModel
+            const LLModel* origin = mModelLoader->mModelList.front();
+            const LLModelInstance& mi = mModelLoader->mScene.begin()->second.front();
+            for (U32 i = 1; i < mBaseModel.size(); ++i)
+            {
+                LLPointer<LLModel> copy(new LLModel(origin->getParams(), origin->getDetail()));
+                copy->mLabel = origin->mLabel;
+                copy->copyVolumeFaces(origin);
+                copy->mPosition = origin->mPosition;
+                copy->mMaterialList = origin->mMaterialList;
+                mModel[loaded_lod].push_back(copy);
+                mScene[loaded_lod][mi.mTransform].push_back(LLModelInstance(copy, copy->mLabel, mi.mTransform, mi.mMaterial));
+            }
+        }
+
         mVertexBuffer[loaded_lod].clear();
 
         setPreviewLOD(loaded_lod);
@@ -1166,6 +1191,17 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)
                                     LLFloaterModelPreview::addStringToLog(out, false);
                                 }
                                 mModel[loaded_lod][idx]->mLabel = name;
+                                // Rename the correspondent instance as well
+                                [&]()
+                                {
+                                    for (auto& p : mScene[loaded_lod])
+                                        for (auto& i : p.second)
+                                            if (i.mModel == mModel[loaded_lod][idx])
+                                            {
+                                                i.mLabel = name;
+                                                return;
+                                            }
+                                }();
                             }
                         }
                     }