diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index c45db3b1859d0a67d36ec9270d8ce69c7ed5ade7..9a02fecd7261799bcee325b3678cb149557a9f24 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -869,6 +869,25 @@ std::string LLStringOps::getDatetimeCode (std::string key)
 	}
 }
 
+std::string LLStringOps::getReadableNumber(F64 num)
+{
+    if (fabs(num)>=1e9)
+    {
+		return llformat("%.2lfB", num / 1e9);
+    }
+    else if (fabs(num)>=1e6)
+    {
+		return llformat("%.2lfM", num / 1e6);
+    }
+    else if (fabs(num)>=1e3)
+    {
+		return llformat("%.2lfK", num / 1e3);
+    }
+    else
+    {
+		return llformat("%.2lf", num);
+    }
+}
 
 namespace LLStringFn
 {
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index abe5fda603ff8244f25403438d5d4c43b0a77bfe..627ca05f14db1077aaa83f610f1b1d6c9fbdb873 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -211,6 +211,9 @@ class LL_COMMON_API LLStringOps
 	static bool getPacificDaylightTime(void) { return sPacificDaylightTime;}
 
 	static std::string getDatetimeCode (std::string key);
+
+    // Express a value like 1234567 as "1.23M" 
+    static std::string getReadableNumber(F64 num);
 };
 
 /**
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 94e1390c425a2c330ccfa52c49760fd1b35ace0d..17e3d68c72c2c881ca21d1ae50535905de951dd5 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -3643,6 +3643,42 @@ U32 LLViewerObject::recursiveGetTriangleCount(S32* vcount) const
     return total_tris;
 }
 
+// This is using the stored surface area for each volume (which
+// defaults to 1.0 for the case of everything except a sculpt) and
+// then scaling it linearly based on the largest dimension in the
+// prim's scale. Should revisit at some point.
+F32 LLViewerObject::recursiveGetScaledSurfaceArea() const
+{
+    F32 area = 0.f;
+    const LLDrawable* drawable = mDrawable;
+    if (drawable)
+    {
+        const LLVOVolume* volume = drawable->getVOVolume();
+        if (volume)
+        {
+            if (volume->getVolume())
+            {
+				const LLVector3& scale = volume->getScale();
+                area += volume->getVolume()->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]);
+            }
+            LLViewerObject::const_child_list_t children = volume->getChildren();
+            for (LLViewerObject::const_child_list_t::const_iterator child_iter = children.begin();
+                 child_iter != children.end();
+                 ++child_iter)
+            {
+                LLViewerObject* child_obj = *child_iter;
+                LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj );
+                if (child && child->getVolume())
+                {
+                    const LLVector3& scale = child->getScale();
+                    area += child->getVolume()->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]);
+                }
+            }
+        }
+    }
+    return area;
+}
+
 void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
 {
 	LLVector4a center;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index a84b6da96c327b766c5f51b584e88415ab2b4605..e2deb89e55001533993f47088f2d08a8bc5de927 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -363,6 +363,7 @@ class LLViewerObject
 	virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL, F32* unscaled_value = NULL) const;
 	virtual U32 getTriangleCount(S32* vcount = NULL) const;
 	virtual U32 getHighLODTriangleCount();
+    F32 recursiveGetScaledSurfaceArea() const;
 
     U32 recursiveGetTriangleCount(S32* vcount = NULL) const;
 
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index d5301c38bad5fec2edae338018d0dbde2d8a38c8..e849e14a5b51dfc29c6109d3a3fe6eb68bb2b0fb 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -620,6 +620,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
 	LLViewerObject(id, pcode, regionp),
 	mSpecialRenderMode(0),
 	mAttachmentSurfaceArea(0.f),
+	mDirectAttachmentSurfaceArea(0.f),
 	mAttachmentVisibleTriangleCount(0),
 	mAttachmentEstTriangleCount(0.f),
 	mReportedVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN),
@@ -9230,12 +9231,14 @@ void LLVOAvatar::idleUpdateRenderComplexity()
 		mText->addLine(info_line, info_color, info_style);
 
         // Triangle count
-        mText->addLine(llformat("Tris %u",mAttachmentVisibleTriangleCount), info_color, info_style);
-        mText->addLine(llformat("Est Tris %f",mAttachmentEstTriangleCount), info_color, info_style);
+        mText->addLine(std::string("VisTris ") + LLStringOps::getReadableNumber(mAttachmentVisibleTriangleCount), 
+                       info_color, info_style);
+        mText->addLine(std::string("EstMaxTris ") + LLStringOps::getReadableNumber(mAttachmentEstTriangleCount), 
+                       info_color, info_style);
 
 		// Attachment Surface Area
 		static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit", 1000.0f);
-		info_line = llformat("%.0f m^2", mAttachmentSurfaceArea);
+		info_line = llformat("%.0f m^2 (%.0f)", mAttachmentSurfaceArea, mDirectAttachmentSurfaceArea);
 
 		if (max_render_cost != 0 && max_attachment_area != 0) // zero means don't care, so don't bother coloring based on this
 		{
@@ -9288,6 +9291,7 @@ void LLVOAvatar::accountRenderComplexityForObject(
     {
         mAttachmentVisibleTriangleCount += attached_object->recursiveGetTriangleCount();
         mAttachmentEstTriangleCount += attached_object->recursiveGetEstTrianglesMax();
+        mDirectAttachmentSurfaceArea += attached_object->recursiveGetScaledSurfaceArea();
 
         textures.clear();
         const LLDrawable* drawable = attached_object->mDrawable;
@@ -9441,7 +9445,8 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
 
         mAttachmentVisibleTriangleCount = 0;
         mAttachmentEstTriangleCount = 0.f;
-
+        mDirectAttachmentSurfaceArea = 0.f;
+        
         // A standalone animated object needs to be accounted for
         // using its associated volume. Attached animated objects
         // will be covered by the subsequent loop over attachments.
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 5f7d23050e3b56fd8f626b0c41f9c33fb0f797ae..f9a1d7b424554a85b8f2453b138efea9f2e3f67c 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -438,6 +438,7 @@ class LLVOAvatar :
         
   private:
 	F32			mAttachmentSurfaceArea; //estimated surface area of attachments
+	F32			mDirectAttachmentSurfaceArea; //estimated surface area of attachments
     U32			mAttachmentVisibleTriangleCount;
     F32			mAttachmentEstTriangleCount;
 	bool		shouldAlphaMask();
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 7fec240d1be6ae0835622aa63e4ba9c05338d3c2..981ec6ec331486426eba4c43774f0d8be5137518 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4905,8 +4905,6 @@ static LLDrawPoolAvatar* get_avatar_drawpool(LLViewerObject* vobj)
 
 void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 {
-	
-
 	if (group->changeLOD())
 	{
 		group->mLastUpdateDistance = group->mDistance;
@@ -4927,13 +4925,16 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 
 	group->mBuilt = 1.f;
 	
-	LLVOAvatar* pAvatarVO = NULL;
-	LLVOAvatar *attached_av = NULL;
+	LLVOAvatar *rigged_av = NULL;
+    LLVOAvatar *attached_av = NULL;
 
 	LLSpatialBridge* bridge = group->getSpatialPartition()->asBridge();
+    LLViewerObject *vobj = NULL;
+    LLVOVolume *vol_obj = NULL;
 	if (bridge)
 	{
-        LLViewerObject* vobj = bridge->mDrawable->getVObj();
+        vobj = bridge->mDrawable->getVObj();
+        vol_obj = dynamic_cast<LLVOVolume*>(vobj);
 		if (bridge->mAvatar.isNull())
 		{
 			if (vobj)
@@ -4941,17 +4942,25 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 				bridge->mAvatar = vobj->getAvatar();
 			}
 		}
-        if (vobj)
-        {
-            attached_av = vobj->getAvatarAncestor();
-        }
-		pAvatarVO = bridge->mAvatar;
+        rigged_av = bridge->mAvatar;
 	}
+    if (vobj)
+    {
+        attached_av = vobj->getAvatarAncestor();
+    }
 
-	if (attached_av)
-	{
-		attached_av->subtractAttachmentArea( group->mSurfaceArea );
-	}
+    if (attached_av)
+    {
+        attached_av->subtractAttachmentArea( group->mSurfaceArea );
+    }
+    if (rigged_av && (rigged_av != attached_av))
+    {
+        rigged_av->subtractAttachmentArea( group->mSurfaceArea );
+    }
+    if (vol_obj)
+    {
+        vol_obj->updateVisualComplexity();
+    }
 
 	group->mGeometryBytes = 0;
 	group->mSurfaceArea = 0;
@@ -5046,7 +5055,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
                 }
                 if (vobj->getControlAvatar())
                 {
-                    pAvatarVO = vobj->getControlAvatar();
+                    rigged_av = vobj->getControlAvatar();
                 }
             }
             else
@@ -5066,13 +5075,13 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 			bool is_rigged = false;
 
             // AXON handle NPC case
-            if (rigged && pAvatarVO && !vobj->isAnimatedObject())
+            if (rigged && rigged_av && !vobj->isAnimatedObject())
             {
-                pAvatarVO->addAttachmentOverridesForObject(vobj);
-				if (!LLApp::isExiting() && pAvatarVO->isSelf() && debugLoggingEnabled("AvatarAttachments"))
+                rigged_av->addAttachmentOverridesForObject(vobj);
+				if (!LLApp::isExiting() && rigged_av->isSelf() && debugLoggingEnabled("AvatarAttachments"))
                 {
                     bool verbose = true;
-					pAvatarVO->showAttachmentOverrides(verbose);
+					rigged_av->showAttachmentOverrides(verbose);
 				}
             }
 
@@ -5527,10 +5536,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 
 	mFaceList.clear();
 
-	if (attached_av)
-	{
+    if (attached_av)
+    {
         attached_av->addAttachmentArea( group->mSurfaceArea );
-	}
+    }
+    if (rigged_av && (rigged_av != attached_av))
+    {
+        rigged_av->addAttachmentArea( group->mSurfaceArea );
+    }
 }
 
 static LLTrace::BlockTimerStatHandle FTM_REBUILD_MESH_FLUSH("Flush Mesh");