diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 6106dde7340c5846392070b24c7cbf4df5e4f17d..ae900c3ecd5ec55eae1f2578057a4b703a8e81ea 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10218,6 +10218,17 @@
       <key>Value</key>
       <real>1.0</real>
     </map>
+    <key>RenderRiggedLODFactor</key>
+    <map>
+      <key>Comment</key>
+      <string>Controls level of detail of worn rigged meshes (multiplier for current screen area when calculated level of detail)</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>F32</string>
+      <key>Value</key>
+      <real>2.5</real>
+    </map>
     <key>RenderWater</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index acbcb4f8b7e274170c9dbd177e92d6f7548a7390..8406f09114d5cc46f75869a1710cc28b2ce60174 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -587,6 +587,7 @@ static void settings_to_globals()
 	LLImageGL::sGlobalUseAnisotropic	= gSavedSettings.getBOOL("RenderAnisotropic");
 	LLImageGL::sCompressTextures		= gSavedSettings.getBOOL("RenderCompressTextures");
 	LLVOVolume::sLODFactor				= gSavedSettings.getF32("RenderVolumeLODFactor");
+	LLVOVolume::sRiggedLODFactor	= gSavedSettings.getF32("RenderRiggedLODFactor");
 	LLVOVolume::sDistanceFactor			= 1.f-LLVOVolume::sLODFactor * 0.1f;
 	LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");
 	LLVOTree::sTreeFactor				= gSavedSettings.getF32("RenderTreeLODFactor");
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 16f40fb747393d55ff6f6c0f177040f065062470..abb92476d613046965ded4a5c3786f99a6e95cb4 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -207,6 +207,12 @@ static bool handleVolumeLODChanged(const LLSD& newvalue)
 	return true;
 }
 
+static bool handleRiggedLODChanged(const LLSD& newvalue)
+{
+    LLVOVolume::sRiggedLODFactor = (F32)newvalue.asReal();
+    return true;
+}
+
 static bool handleAvatarLODChanged(const LLSD& newvalue)
 {
 	LLVOAvatar::sLODFactor = (F32) newvalue.asReal();
@@ -619,6 +625,7 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
+	gSavedSettings.getControl("RenderRiggedLODFactor")->getSignal()->connect(boost::bind(&handleRiggedLODChanged, _2));
 	gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
 	gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _2));
 	gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2));
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index fea22351758b3dd5603cbad0aa1c697d43d0660e..9abeed8de74f508ad07365d6ff32adb52bd5dae7 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -86,6 +86,7 @@ BOOL gAnimateTextures = TRUE;
 //extern BOOL gHideSelectedObjects;
 
 F32 LLVOVolume::sLODFactor = 1.f;
+F32 LLVOVolume::sRiggedLODFactor = 2.f;
 F32	LLVOVolume::sLODSlopDistanceFactor = 0.5f; //Changing this to zero, effectively disables the LOD transition slop 
 F32 LLVOVolume::sDistanceFactor = 1.0f;
 S32 LLVOVolume::sNumLODChanges = 0;
@@ -1252,7 +1253,10 @@ BOOL LLVOVolume::calcLOD()
 		}
 
 		distance = avatar->mDrawable->mDistanceWRTCamera;
-		radius = avatar->getBinRadius();
+		F32 avatar_radius = avatar->getBinRadius();
+		F32 object_radius = getVolume() ? getVolume()->mLODScaleBias.scaledVec(getScale()).length() : getScale().length();
+		radius = object_radius * LLVOVolume::sRiggedLODFactor;
+		radius = llmin(radius, avatar_radius);
 	}
 	else
 	{
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index a3319083200be4300e5abebf5201bdeaa2d30dac..b63d76d13259c628875e8db05e31a233dd4dfddd 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -379,6 +379,7 @@ class LLVOVolume : public LLViewerObject
 public:
 	static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop
 	static F32 sLODFactor;				// LOD scale factor
+	static F32 sRiggedLODFactor;	// Worn rigged LOD scale factor
 	static F32 sDistanceFactor;			// LOD distance factor
 
 	static LLPointer<LLObjectMediaDataClient> sObjectMediaClient;