diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index d91336951da6abf2146c68d09e70bfb60a670f39..59c3361f3b12c67b12d365f75dcc9a3c136eca63 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -1303,5 +1303,16 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>ALInspectColumnConfig</key>
+    <map>
+      <key>Comment</key>
+      <string>Stores the column visibility of the inspect window</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>U32</string>
+      <key>Value</key>
+      <integer>1023</integer>
+    </map>
   </map>
 </llsd>
diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp
index 296351014ee4c844f6966ac7a6061d074ae19b63..1a532f0e55013e1ce61e1acc23bcda31cfadd775 100644
--- a/indra/newview/llfloaterinspect.cpp
+++ b/indra/newview/llfloaterinspect.cpp
@@ -47,6 +47,15 @@
 #include "rlvcommon.h"
 #include "rlvui.h"
 // [/RLVa:KB]
+#include "llresmgr.h"
+#include "lltexturectrl.h"
+#include "llviewerobjectlist.h" //gObjectList
+#include "llviewertexturelist.h"
+#include "llvovolume.h"
+#include "llmenugl.h"
+#include "llmenubutton.h"
+#include "lltoggleablemenu.h"
+#include "llviewermenu.h"			// for gMenuHolder
 
 //LLFloaterInspect* LLFloaterInspect::sInstance = NULL;
 
@@ -54,19 +63,39 @@ LLFloaterInspect::LLFloaterInspect(const LLSD& key)
   : LLFloater(key),
 	mDirty(FALSE),
 	mOwnerNameCacheConnection(),
-	mCreatorNameCacheConnection()
+	mCreatorNameCacheConnection(),
+	mOptionsButton(NULL),
+	mInspectColumnConfigConnection(),
+	mLastResizeDelta(0)
 {
 	mCommitCallbackRegistrar.add("Inspect.OwnerProfile",	boost::bind(&LLFloaterInspect::onClickOwnerProfile, this));
 	mCommitCallbackRegistrar.add("Inspect.CreatorProfile",	boost::bind(&LLFloaterInspect::onClickCreatorProfile, this));
 	mCommitCallbackRegistrar.add("Inspect.SelectObject",	boost::bind(&LLFloaterInspect::onSelectObject, this));
+
+	mCommitCallbackRegistrar.add("Inspect.ToggleColumn",			boost::bind(&LLFloaterInspect::onColumnVisibilityChecked, this, _2));
+	mEnableCallbackRegistrar.add("Inspect.EnableColumn",	boost::bind(&LLFloaterInspect::onEnableColumnVisibilityChecked, this, _2));
+
+	mColumnBits["object_name"] = 1;
+	mColumnBits["description"] = 2;
+	mColumnBits["owner_name"] = 4;
+	mColumnBits["creator_name"] = 8;
+	mColumnBits["facecount"] = 16;
+	mColumnBits["vertexcount"] = 32;
+	mColumnBits["trianglecount"] = 64;
+	mColumnBits["tramcount"] = 128;
+	mColumnBits["vramcount"] = 256;
+	mColumnBits["creation_date"] = 512;
 }
 
 BOOL LLFloaterInspect::postBuild()
 {
 	mObjectList = getChild<LLScrollListCtrl>("object_list");
-//	childSetAction("button owner",onClickOwnerProfile, this);
-//	childSetAction("button creator",onClickCreatorProfile, this);
-//	childSetCommitCallback("object_list", onSelectObject, NULL);
+
+	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+	mInspectColumnConfigConnection = gSavedSettings.getControl("ALInspectColumnConfig")->getSignal()->connect(boost::bind(&LLFloaterInspect::onColumnDisplayModeChanged, this));
+	onColumnDisplayModeChanged();
 	
 	refresh();
 	
@@ -83,6 +112,10 @@ LLFloaterInspect::~LLFloaterInspect(void)
 	{
 		mCreatorNameCacheConnection.disconnect();
 	}
+	if (mInspectColumnConfigConnection.connected())
+	{
+		mInspectColumnConfigConnection.disconnect();
+	}
 	if(!LLFloaterReg::instanceVisible("build"))
 	{
 		if(LLToolMgr::getInstance()->getBaseTool() == LLToolCompInspect::getInstance())
@@ -281,6 +314,23 @@ void LLFloaterInspect::refresh()
 {
 	std::string creator_name;
 	S32 pos = mObjectList->getScrollPos();
+	LLLocale locale("");
+	LLResMgr& res_mgr = LLResMgr::instance();
+	LLSelectMgr& sel_mgr = LLSelectMgr::instance();
+	S32 fcount = 0;
+	S32 fcount_visible = 0;
+	S32 tcount = 0;
+	S32 vcount = 0;
+	S32 objcount = 0;
+	S32 primcount = 0;
+	U32 complexity = 0;
+	mTextureList.clear();
+	mTextureMemory = 0;
+	mTextureVRAMMemory = 0;
+	std::string format_res_string;
+	static LLCachedControl<F32> max_complexity_setting(gSavedSettings, "MaxAttachmentComplexity");
+	F32 max_attachment_complexity = max_complexity_setting;
+	max_attachment_complexity = llmax(max_attachment_complexity, 1.0e6f);
 	getChildView("button owner")->setEnabled(false);
 	getChildView("button creator")->setEnabled(false);
 	LLUUID selected_uuid;
@@ -303,6 +353,7 @@ void LLFloaterInspect::refresh()
 		LLSelectNode* obj = *iter;
 		LLSD row;
 		std::string owner_name, creator_name;
+		auto vobj = obj->getObject();
 
 		if (obj->mCreationDate == 0)
 		{	// Don't have valid information from the server, so skip this one
@@ -325,7 +376,7 @@ void LLFloaterInspect::refresh()
 			const LLUUID& idGroup = obj->mPermissions->getGroup();
 			if(gCacheName->getGroupName(idGroup, group_name))
 			{
-				owner_name = "[" + group_name + "] (group)";
+				owner_name = "[" + group_name + "] " + getString("Group");
 			}
 			else
 			{
@@ -380,12 +431,12 @@ void LLFloaterInspect::refresh()
 			mCreatorNameCacheConnection = LLAvatarNameCache::get(idCreator, boost::bind(&LLFloaterInspect::onGetCreatorNameCallback, this));
 		}
 		
-		row["id"] = obj->getObject()->getID();
+		row["id"] = vobj->getID();
 		row["columns"][0]["column"] = "object_name";
 		row["columns"][0]["type"] = "text";
 		// make sure we're either at the top of the link chain
 		// or top of the editable chain, for attachments
-		if(!(obj->getObject()->isRoot() || obj->getObject()->isRootEdit()))
+		if(!(vobj->isRoot() || vobj->isRootEdit()))
 		{
 			row["columns"][0]["value"] = std::string("   ") + obj->mName;
 		}
@@ -402,8 +453,113 @@ void LLFloaterInspect::refresh()
 		row["columns"][3]["column"] = "creation_date";
 		row["columns"][3]["type"] = "text";
 		row["columns"][3]["value"] = timeStr;
+		row["columns"][4]["column"] = "description";
+		row["columns"][4]["type"] = "text";
+		row["columns"][4]["value"] = obj->mDescription;
+		row["columns"][5]["column"] = "creation_date_sort";
+		row["columns"][5]["type"] = "text";
+		row["columns"][5]["value"] = llformat("%d", timestamp);
+
+		res_mgr.getIntegerString(format_res_string, vobj->getNumFaces());
+		row["columns"][6]["column"] = "facecount";
+		row["columns"][6]["type"] = "text";
+		row["columns"][6]["value"] = format_res_string;
+
+		res_mgr.getIntegerString(format_res_string, vobj->getNumVertices());
+		row["columns"][7]["column"] = "vertexcount";
+		row["columns"][7]["type"] = "text";
+		row["columns"][7]["value"] = format_res_string;
+
+		res_mgr.getIntegerString(format_res_string, vobj->getNumIndices() / 3);
+		row["columns"][8]["column"] = "trianglecount";
+		row["columns"][8]["type"] = "text";
+		row["columns"][8]["value"] = format_res_string;
+
+		// Poundlife - Get VRAM
+		U32 texture_memory = 0;
+		U32 vram_memory = 0;
+		getObjectTextureMemory(vobj, texture_memory, vram_memory);
+		res_mgr.getIntegerString(format_res_string, texture_memory / 1024);
+		row["columns"][9]["column"] = "tramcount";
+		row["columns"][9]["type"] = "text";
+		row["columns"][9]["value"] = format_res_string;
+
+		res_mgr.getIntegerString(format_res_string, vram_memory / 1024);
+		row["columns"][10]["column"] = "vramcount";
+		row["columns"][10]["type"] = "text";
+		row["columns"][10]["value"] = format_res_string;
+
+		row["columns"][11]["column"] = "facecount_sort";
+		row["columns"][11]["type"] = "text";
+		row["columns"][11]["value"] = LLSD::Integer(vobj->getNumFaces());
+
+		row["columns"][12]["column"] = "vertexcount_sort";
+		row["columns"][12]["type"] = "text";
+		row["columns"][12]["value"] = LLSD::Integer(vobj->getNumVertices());
+
+		row["columns"][13]["column"] = "trianglecount_sort";
+		row["columns"][13]["type"] = "text";
+		row["columns"][13]["value"] = LLSD::Integer(vobj->getNumIndices() / 3);
+
+		row["columns"][14]["column"] = "tramcount_sort";
+		row["columns"][14]["type"] = "text";
+		row["columns"][14]["value"] = LLSD::Integer(texture_memory / 1024);
+
+		row["columns"][15]["column"] = "vramcount_sort";
+		row["columns"][15]["type"] = "text";
+		row["columns"][15]["value"] = LLSD::Integer(vram_memory / 1024);
+
+		primcount = sel_mgr.getSelection()->getObjectCount();
+		objcount = sel_mgr.getSelection()->getRootObjectCount();
+		fcount += vobj->getNumFaces();
+		fcount_visible += vobj->getNumVisibleFaces();
+		tcount += vobj->getNumIndices() / 3;
+		vcount += vobj->getNumVertices();
+
 		mObjectList->addElement(row, ADD_TOP);
 	}
+
+	for (LLObjectSelection::valid_root_iterator root_it = mObjectSelection->valid_root_begin(); root_it != mObjectSelection->valid_root_end(); ++root_it)
+	{
+		LLSelectNode* obj = *root_it;
+		LLVOVolume* volume = dynamic_cast<LLVOVolume*>(obj->getObject());
+		if (volume)
+		{
+			LLVOVolume::texture_cost_t textures;
+			F32 attachment_total_cost = 0;
+			F32 attachment_volume_cost = 0;
+			F32 attachment_texture_cost = 0;
+			F32 attachment_children_cost = 0;
+
+			attachment_volume_cost += volume->getRenderCost(textures);
+
+			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)
+				{
+					attachment_children_cost += child->getRenderCost(textures);
+				}
+			}
+
+			for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin();
+				volume_texture != textures.end();
+				++volume_texture)
+			{
+				// add the cost of each individual texture in the linkset
+				attachment_texture_cost += volume_texture->second;
+			}
+			attachment_total_cost = attachment_volume_cost + attachment_texture_cost + attachment_children_cost;
+
+			// Limit attachment complexity to avoid signed integer flipping of the wearer's ACI
+			complexity += (U32)llclamp(attachment_total_cost, 0.f, max_attachment_complexity);
+		}
+	}
+
 	if(selected_index > -1 && mObjectList->getItemIndex(selected_uuid) == selected_index)
 	{
 		mObjectList->selectNthItem(selected_index);
@@ -414,6 +570,111 @@ void LLFloaterInspect::refresh()
 	}
 	onSelectObject();
 	mObjectList->setScrollPos(pos);
+
+	LLStringUtil::format_map_t args;
+	res_mgr.getIntegerString(format_res_string, objcount);
+	args["NUM_OBJECTS"] = format_res_string;
+	res_mgr.getIntegerString(format_res_string, primcount);
+	args["NUM_PRIMS"] = format_res_string;
+	res_mgr.getIntegerString(format_res_string, fcount_visible);
+	args["NUM_VISIBLE_FACES"] = format_res_string;
+	res_mgr.getIntegerString(format_res_string, fcount);
+	args["NUM_FACES"] = format_res_string;
+	res_mgr.getIntegerString(format_res_string, vcount);
+	args["NUM_VERTICES"] = format_res_string;
+	res_mgr.getIntegerString(format_res_string, tcount);
+	args["NUM_TRIANGLES"] = format_res_string;
+	res_mgr.getIntegerString(format_res_string, mTextureList.size());
+	args["NUM_TEXTURES"] = format_res_string;
+	res_mgr.getIntegerString(format_res_string, mTextureMemory / 1024);
+	args["TEXTURE_MEMORY"] = format_res_string;
+	res_mgr.getIntegerString(format_res_string, mTextureVRAMMemory / 1024);
+	args["VRAM_USAGE"] = format_res_string;
+	res_mgr.getIntegerString(format_res_string, complexity);
+	args["COMPLEXITY"] = format_res_string;
+	getChild<LLTextBase>("linksetstats_text")->setText(getString("stats_list", args));
+}
+
+void LLFloaterInspect::getObjectTextureMemory(LLViewerObject* object, U32& object_texture_memory, U32& object_vram_memory)
+{
+	uuid_vec_t object_texture_list;
+
+	if (!object)
+	{
+		return;
+	}
+
+	LLUUID uuid;
+	U8 te_count = object->getNumTEs();
+
+	for (U8 j = 0; j < te_count; j++)
+	{
+		LLViewerTexture* img = object->getTEImage(j);
+		if (img)
+		{
+			calculateTextureMemory(img, object_texture_list, object_texture_memory, object_vram_memory);
+		}
+
+		// materials per face
+		if (object->getTE(j)->getMaterialParams().notNull())
+		{
+			uuid = object->getTE(j)->getMaterialParams()->getNormalID();
+			if (uuid.notNull())
+			{
+				LLViewerTexture* img = gTextureList.findImage(uuid, TEX_LIST_STANDARD);
+				if (img)
+				{
+					calculateTextureMemory(img, object_texture_list, object_texture_memory, object_vram_memory);
+				}
+			}
+
+			uuid = object->getTE(j)->getMaterialParams()->getSpecularID();
+			if (uuid.notNull())
+			{
+				LLViewerTexture* img = gTextureList.findImage(uuid, TEX_LIST_STANDARD);
+				if (img)
+				{
+					calculateTextureMemory(img, object_texture_list, object_texture_memory, object_vram_memory);
+				}
+			}
+		}
+	}
+
+	// sculpt map
+	if (object->isSculpted() && !object->isMesh())
+	{
+		const LLSculptParams* sculpt_params = object->getSculptParams();
+		if (sculpt_params)
+		{
+			uuid = sculpt_params->getSculptTexture();
+			LLViewerTexture* img = gTextureList.findImage(uuid, TEX_LIST_STANDARD);
+			if (img)
+			{
+				calculateTextureMemory(img, object_texture_list, object_texture_memory, object_vram_memory);
+			}
+		}
+	}
+}
+
+void LLFloaterInspect::calculateTextureMemory(LLViewerTexture* texture, uuid_vec_t& object_texture_list, U32& object_texture_memory, U32& object_vram_memory)
+{
+	const LLUUID uuid = texture->getID();
+	U32 vram_memory = (texture->getFullHeight() * texture->getFullWidth() * 32 / 8);
+	U32 texture_memory = (texture->getFullHeight() * texture->getFullWidth() * texture->getComponents());
+
+	if (std::find(mTextureList.begin(), mTextureList.end(), uuid) == mTextureList.end())
+	{
+		mTextureList.push_back(uuid);
+		mTextureMemory += texture_memory;
+		mTextureVRAMMemory += vram_memory;
+	}
+
+	if (std::find(object_texture_list.begin(), object_texture_list.end(), uuid) == object_texture_list.end())
+	{
+		object_texture_list.push_back(uuid);
+		object_texture_memory += texture_memory;
+		object_vram_memory += vram_memory;
+	}
 }
 
 void LLFloaterInspect::onFocusReceived()
@@ -449,3 +710,101 @@ void LLFloaterInspect::draw()
 
 	LLFloater::draw();
 }
+
+void LLFloaterInspect::onColumnDisplayModeChanged()
+{
+	U32 column_config = gSavedSettings.getU32("ALInspectColumnConfig");
+	std::vector<LLScrollListColumn::Params> column_params = mObjectList->getColumnInitParams();
+	S32 column_padding = mObjectList->getColumnPadding();
+
+	S32 default_width = 0;
+	S32 new_width = 0;
+	S32 min_width, min_height;
+	getResizeLimits(&min_width, &min_height);
+
+	std::string current_sort_col = mObjectList->getSortColumnName();
+	BOOL current_sort_asc = mObjectList->getSortAscending();
+	
+	mObjectList->clearRows();
+	mObjectList->clearColumns();
+	mObjectList->updateLayout();
+
+	std::vector<LLScrollListColumn::Params>::iterator param_it;
+	for (param_it = column_params.begin(); param_it != column_params.end(); ++param_it)
+	{
+		LLScrollListColumn::Params p = *param_it;
+		default_width += (p.width.pixel_width.getValue() + column_padding);
+		
+		LLScrollListColumn::Params params;
+		params.header = p.header;
+		params.name = p.name;
+		params.halign = p.halign;
+		params.sort_direction = p.sort_direction;
+		params.sort_column = p.sort_column;
+		params.tool_tip = p.tool_tip;
+
+		if (column_config & mColumnBits[p.name.getValue()])
+		{
+			params.width = p.width;
+			new_width += (params.width.pixel_width.getValue() + column_padding);
+		}
+		else
+		{
+			params.width.pixel_width.set(-1, true);
+		}
+
+		mObjectList->addColumn(params);
+	}
+
+	min_width -= (default_width - new_width - mLastResizeDelta);
+	mLastResizeDelta = default_width - new_width;
+	setResizeLimits(min_width, min_height);
+
+	if (getRect().getWidth() < min_width)
+	{
+		reshape(min_width, getRect().getHeight());
+	}
+
+	if (!current_sort_col.empty())
+	{
+		if ((current_sort_col == "creation_date_sort" && mObjectList->getColumn("creation_date")->getWidth() == -1) ||
+			mObjectList->getColumn(current_sort_col)->getWidth() == -1)
+		{
+			mObjectList->clearSortOrder();
+		}
+		else
+		{
+			mObjectList->sortByColumn(current_sort_col, current_sort_asc);
+		}
+	}
+	mObjectList->setFilterColumn(0);
+	mObjectList->dirtyColumns();
+	setDirty();
+}
+
+void LLFloaterInspect::onColumnVisibilityChecked(const LLSD& userdata)
+{
+	std::string column = userdata.asString();
+	U32 column_config = gSavedSettings.getU32("ALInspectColumnConfig");
+
+	U32 new_value;
+	U32 enabled = (mColumnBits[column] & column_config);
+	if (enabled)
+	{
+		new_value = (column_config & ~mColumnBits[column]);
+	}
+	else
+	{
+		new_value = (column_config | mColumnBits[column]);
+	}
+
+	gSavedSettings.setU32("ALInspectColumnConfig", new_value);
+}
+
+bool LLFloaterInspect::onEnableColumnVisibilityChecked(const LLSD& userdata)
+{
+	std::string column = userdata.asString();
+	U32 column_config = gSavedSettings.getU32("ALInspectColumnConfig");
+
+	return (mColumnBits[column] & column_config);
+}
diff --git a/indra/newview/llfloaterinspect.h b/indra/newview/llfloaterinspect.h
index d05f9800c36da2e05ae6e35752358992630cc0e0..4da9f292e474a61d666fa69c786fdf0a62d37e2a 100644
--- a/indra/newview/llfloaterinspect.h
+++ b/indra/newview/llfloaterinspect.h
@@ -31,6 +31,7 @@
 
 #include "llavatarname.h"
 #include "llfloater.h"
+#include "llviewerobject.h" // PoundLife - Improved Object Inspect
 
 //class LLTool;
 class LLObjectSelection;
@@ -39,6 +40,7 @@ class LLUICtrl;
 // [RLVa:KB] - Checked: RLVa-2.0.1
 class LLSelectNode;
 // [/RLVa:KB]
+class LLMenuButton; // <FS:Ansariel> FIRE-22292: Configurable columns
 
 class LLFloaterInspect final : public LLFloater
 {
@@ -58,6 +60,7 @@ class LLFloaterInspect final : public LLFloater
 	void onClickOwnerProfile();
 	void onSelectObject();
 
+	U64 mStatsMemoryTotal;
 	LLScrollListCtrl* mObjectList;
 protected:
 	// protected members
@@ -69,6 +72,11 @@ class LLFloaterInspect final : public LLFloater
 // [/RLVa:KB]
 
 private:
+	void getObjectTextureMemory(LLViewerObject* object, U32& object_texture_memory, U32& object_vram_memory);
+	void calculateTextureMemory(LLViewerTexture* texture, uuid_vec_t& object_texture_list, U32& object_texture_memory, U32& object_vram_memory);
+	uuid_vec_t mTextureList;
+	U32 mTextureMemory;
+	U32 mTextureVRAMMemory;
 	void onGetOwnerNameCallback();
 	void onGetCreatorNameCallback();
 	
@@ -78,6 +86,16 @@ class LLFloaterInspect final : public LLFloater
 	LLSafeHandle<LLObjectSelection> mObjectSelection;
 	boost::signals2::connection mOwnerNameCacheConnection;
 	boost::signals2::connection mCreatorNameCacheConnection;
+	boost::signals2::connection	mInspectColumnConfigConnection;
+
+	void						onColumnDisplayModeChanged();
+	void						onColumnVisibilityChecked(const LLSD& userdata);
+	bool						onEnableColumnVisibilityChecked(const LLSD& userdata);
+
+	LLMenuButton*				mOptionsButton;
+
+	std::map<std::string, U32>	mColumnBits;
+	S32							mLastResizeDelta;
 };
 
 #endif //LL_LLFLOATERINSPECT_H
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 068774d81e71de398b883432bd000c90dced51da..9bc213f82788aa56844bbae33f3bdc4bec600513 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -516,6 +516,23 @@ void LLViewerObject::markDead()
 	}
 }
 
+S32 LLViewerObject::getNumVisibleFaces() const 
+{ 
+	int v{0}; 
+	if(mDrawable.notNull())
+	{ 
+		for (int i = 0;i < mDrawable->getNumFaces();i++)
+		{
+			const LLFace* f = mDrawable->getFace(i);
+			if (f && f->getTextureEntry() && f->getTextureEntry()->getAlpha() != 0.0f)
+			{
+				v++;
+			}
+		} 
+	}
+	return v;
+};
+
 void LLViewerObject::dump() const
 {
 	LL_INFOS() << "Type: " << pCodeToString(mPrimitiveCode) << LL_ENDL;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 26f46a29ade27474309b6fbe079ed4de27d568ea..18eaaee817feda7068c8fe102b022382fa75f370 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -210,6 +210,7 @@ class LLViewerObject
 	virtual U32 getNumVertices() const;
 	virtual U32 getNumIndices() const;
 	S32 getNumFaces() const { return mNumFaces; }
+	S32 getNumVisibleFaces() const;
 
 	// Graphical stuff for objects - maybe broken out into render class later?
 	virtual void updateTextures();
diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml
index 802a6649c8ab65c0e2de397bb11fc0915fe1017c..d4a615909872edf954bd337f7071d896e95453ca 100644
--- a/indra/newview/skins/default/xui/en/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/en/floater_inspect.xml
@@ -2,73 +2,173 @@
 <floater
  legacy_header_height="18"
  can_resize="true"
- height="300"
+ height="272"
  layout="topleft"
  min_height="300"
- min_width="400"
+ min_width="610"
  name="inspect"
  help_topic="inspect"
  save_rect="true"
- title="INSPECT OBJECTS"
- width="400">
+ title="Inspect Objects"
+ width="610">
     <floater.string
      name="timeStamp">
-        [wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
+        [year,datetime,slt] [mth,datetime,slt] [day,datetime,slt], [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt], [wkday,datetime,slt]
     </floater.string>
+    <floater.string
+     name="Group">
+        (Group)
+    </floater.string>
+    <floater.string name="stats_list">
+        Total stats:
+
+[NUM_OBJECTS] objects, [NUM_PRIMS] prims
+
+Faces: [NUM_FACES]
+Visible: [NUM_VISIBLE_FACES]
+Vertices: [NUM_VERTICES]
+Triangles: [NUM_TRIANGLES]
+Complex.: [COMPLEXITY]
+
+Textures: [NUM_TEXTURES]
+TMem: [TEXTURE_MEMORY] KB
+VRAM: [VRAM_USAGE] KB
+    </floater.string>
+    <text_editor
+      top="24"
+      left="5"
+      width="130"
+      height="189"
+      layout="topleft"
+      follows="left|top|bottom"
+      name="linksetstats_text"
+      max_length="2048"
+      bg_visible="false"
+      border_visible="true"
+      allow_scroll="true"
+      h_pad="2"
+      v_pad="2"
+      read_only="true"
+      tab_stop="false"
+      value="(loading...)"
+      word_wrap="true"/>
     <scroll_list
-     bottom="268"
+     top="24"
+     height="243"
      column_padding="0"
      draw_heading="true"
      follows="top|right|left|bottom"
      layout="topleft"
-     left="10"
+     left_pad="6"
      name="object_list"
-     right="-10"
-     tool_tip="Select an object from this list to highlight it in-world"
-     top="20">
+     right="-6"
+     tool_tip="Select an object from this list to highlight it in-world">
         <scroll_list.columns
-         relative_width="0.25"
+         dynamic_width="true"
          label="Object Name"
          name="object_name" />
         <scroll_list.columns
-         relative_width="0.25"
+         dynamic_width="true"
+         label="Description"
+         name="description" />
+        <scroll_list.columns
+         dynamic_width="true"
          label="Owner Name"
          name="owner_name" />
         <scroll_list.columns
-         relative_width="0.25"
+         dynamic_width="true"
          label="Creator Name"
          name="creator_name" />
         <scroll_list.columns
-         relative_width="0.25"
+         label="Faces"
+         name="facecount"
+         width="45"
+         sort_column="facecount_sort"/>
+        <scroll_list.columns
+         label="Vertices"
+         name="vertexcount"
+         width="55"
+         sort_column="vertexcount_sort"/>
+        <scroll_list.columns
+         label="Triangles"
+         name="trianglecount"
+         width="55"
+         sort_column="trianglecount_sort"/>
+        <scroll_list.columns
+         label="TMem"
+         name="tramcount"
+         width="55"
+         sort_column="tramcount_sort"/>
+        <scroll_list.columns
+         label="VRAM"
+         name="vramcount"
+         width="55"
+         sort_column="vramcount_sort"/>
+        <scroll_list.columns
          label="Creation Date"
-         name="creation_date" />
-		 <scroll_list.commit_callback
-		   function="Inspect.SelectObject" />
+         name="creation_date"
+         dynamic_width="true"
+         sort_column="creation_date_sort"/>
+        <scroll_list.columns
+         label=""
+         name="facecount_sort"
+         width="-1" />
+        <scroll_list.columns
+         label=""
+         name="vertexcount_sort"
+         width="-1" />
+        <scroll_list.columns
+         label=""
+         name="trianglecount_sort"
+         width="-1" />
+        <scroll_list.columns
+         label=""
+         name="tramcount_sort"
+         width="-1" />
+        <scroll_list.columns
+         label=""
+         name="vramcount_sort"
+         width="-1" />
+        <scroll_list.columns
+         label=""
+         name="creation_date_sort"
+         width="-1" />
+         <scroll_list.commit_callback
+         function="Inspect.SelectObject" />
     </scroll_list>
+    <menu_button
+     menu_filename="menu_inspect_options.xml"
+     follows="left|top"
+     height="23"
+     image_overlay="Conv_toolbar_sort"
+     layout="topleft"
+     name="options_btn"
+     tool_tip="Options"
+     top="24"
+     left="103"
+     width="31" />
     <button
      follows="left|bottom"
      height="23"
      label="See Owner Profile..."
      layout="topleft"
-     left_delta="-1"
+     left="4"
      name="button owner"
      tool_tip="See profile of the highlighted object&apos;s owner"
-     top_pad="4"
-     width="150">
-		<button.commit_callback
-		function="Inspect.OwnerProfile" />
-	</button>
+     top="217"
+     width="130">
+        <button.commit_callback
+        function="Inspect.OwnerProfile" />
+    </button>
     <button
      follows="left|bottom"
      height="23"
      label="See Creator Profile..."
      layout="topleft"
-     left_pad="5"
      name="button creator"
      tool_tip="See profile of the highlighted object&apos;s original creator"
-     top_delta="0"
-     width="150">
-		<button.commit_callback
-		function="Inspect.CreatorProfile" />
-	</button>
+     width="130">
+        <button.commit_callback
+        function="Inspect.CreatorProfile" />
+    </button>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_options.xml b/indra/newview/skins/default/xui/en/menu_inspect_options.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e8da0dd7c3a3ca5c4f38cf987cdc3a07a31009d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_inspect_options.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ name="menu_group_plus">
+	<menu_item_check
+	 label="Description"
+	 name="description">
+		<menu_item_check.on_check
+		 function="Inspect.EnableColumn"
+		 parameter="description"/>
+		<menu_item_check.on_click
+		 function="Inspect.ToggleColumn"
+		 parameter="description"/>
+	</menu_item_check>
+	<menu_item_check
+	 label="Owner Name"
+	 name="owner_name">
+		<menu_item_check.on_check
+		 function="Inspect.EnableColumn"
+		 parameter="owner_name"/>
+		<menu_item_check.on_click
+		 function="Inspect.ToggleColumn"
+		 parameter="owner_name"/>
+	</menu_item_check>
+	<menu_item_check
+	 label="Creator Name"
+	 name="creator_name">
+		<menu_item_check.on_check
+		 function="Inspect.EnableColumn"
+		 parameter="creator_name"/>
+		<menu_item_check.on_click
+		 function="Inspect.ToggleColumn"
+		 parameter="creator_name"/>
+	</menu_item_check>
+	<menu_item_check
+	 label="Faces"
+	 name="facecount">
+		<menu_item_check.on_check
+		 function="Inspect.EnableColumn"
+		 parameter="facecount"/>
+		<menu_item_check.on_click
+		 function="Inspect.ToggleColumn"
+		 parameter="facecount"/>
+	</menu_item_check>
+	<menu_item_check
+	 label="Vertices"
+	 name="vertexcount">
+		<menu_item_check.on_check
+		 function="Inspect.EnableColumn"
+		 parameter="vertexcount"/>
+		<menu_item_check.on_click
+		 function="Inspect.ToggleColumn"
+		 parameter="vertexcount"/>
+	</menu_item_check>
+	<menu_item_check
+	 label="Triangles"
+	 name="trianglecount">
+		<menu_item_check.on_check
+		 function="Inspect.EnableColumn"
+		 parameter="trianglecount"/>
+		<menu_item_check.on_click
+		 function="Inspect.ToggleColumn"
+		 parameter="trianglecount"/>
+	</menu_item_check>
+	<menu_item_check
+	 label="TMem"
+	 name="tramcount">
+		<menu_item_check.on_check
+		 function="Inspect.EnableColumn"
+		 parameter="tramcount"/>
+		<menu_item_check.on_click
+		 function="Inspect.ToggleColumn"
+		 parameter="tramcount"/>
+	</menu_item_check>
+	<menu_item_check
+	 label="VRAM"
+	 name="vramcount">
+		<menu_item_check.on_check
+		 function="Inspect.EnableColumn"
+		 parameter="vramcount"/>
+		<menu_item_check.on_click
+		 function="Inspect.ToggleColumn"
+		 parameter="vramcount"/>
+	</menu_item_check>
+	<menu_item_check
+	 label="Creation Date"
+	 name="creation_date">
+		<menu_item_check.on_check
+		 function="Inspect.EnableColumn"
+		 parameter="creation_date"/>
+		<menu_item_check.on_click
+		 function="Inspect.ToggleColumn"
+		 parameter="creation_date"/>
+	</menu_item_check>
+</toggleable_menu>