diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 0031362210c1b9e7b02087331a4ec01a0b6659f5..776ddb9f08a095e64c6ffdd3e5e36cde6dc5203f 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -246,6 +246,7 @@ set(viewer_SOURCE_FILES
     llfloatersnapshot.cpp
     llfloatersounddevices.cpp
     llfloaterspellchecksettings.cpp
+    llfloaterstinson.cpp
     llfloatertelehub.cpp
     llfloatertestinspectors.cpp
     llfloatertestlistview.cpp
@@ -822,6 +823,7 @@ set(viewer_HEADER_FILES
     llfloatersnapshot.h
     llfloatersounddevices.h
     llfloaterspellchecksettings.h
+    llfloaterstinson.h
     llfloatertelehub.h
     llfloatertestinspectors.h
     llfloatertestlistview.h
diff --git a/indra/newview/llfloaterstinson.cpp b/indra/newview/llfloaterstinson.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3129a94178c07b9e03398abd93d1abc4e0ad0baf
--- /dev/null
+++ b/indra/newview/llfloaterstinson.cpp
@@ -0,0 +1,505 @@
+/** 
+* @file llfloaterstinson.cpp
+* @brief Implementation of llfloaterstinson
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterstinson.h"
+
+#include <string>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llenvmanager.h"
+#include "llfloater.h"
+#include "llhttpclient.h"
+#include "llsd.h"
+#include "llselectmgr.h"
+#include "llstring.h"
+#include "llstyle.h"
+#include "lltextbase.h"
+#include "lluicolortable.h"
+#include "llviewerobject.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "v4color.h"
+
+#define MATERIALS_CAPABILITY_NAME         "RenderMaterials"
+
+#define MATERIALS_CAP_FULL_PER_FACE_FIELD "FullMaterialsPerFace"
+#define MATERIALS_CAP_FACE_FIELD          "Face"
+#define MATERIALS_CAP_MATERIAL_FIELD      "Material"
+#define MATERIALS_CAP_OBJECT_ID_FIELD     "ID"
+
+class MaterialsGetResponder : public LLHTTPClient::Responder
+{
+public:
+	typedef boost::function<void (bool, const LLSD&)> CallbackFunction;
+
+	MaterialsGetResponder(const std::string& pCapabilityURL, CallbackFunction pCallback);
+	virtual ~MaterialsGetResponder();
+
+	virtual void result(const LLSD& pContent);
+	virtual void error(U32 pStatus, const std::string& pReason);
+
+protected:
+
+private:
+	std::string      mCapabilityURL;
+	CallbackFunction mCallback;
+};
+
+class MaterialsPutResponder : public LLHTTPClient::Responder
+{
+public:
+	typedef boost::function<void (bool, const LLSD&)> CallbackFunction;
+
+	MaterialsPutResponder(const std::string& pCapabilityURL, CallbackFunction pCallback);
+	virtual ~MaterialsPutResponder();
+
+	virtual void result(const LLSD& pContent);
+	virtual void error(U32 pStatus, const std::string& pReason);
+
+protected:
+
+private:
+	std::string      mCapabilityURL;
+	CallbackFunction mCallback;
+};
+
+BOOL LLFloaterStinson::postBuild()
+{
+	mStatusText = findChild<LLTextBase>("material_status");
+	llassert(mStatusText != NULL);
+
+	mGetButton = findChild<LLButton>("get_button");
+	llassert(mGetButton != NULL);
+	mGetButton->setCommitCallback(boost::bind(&LLFloaterStinson::onGetClicked, this));
+
+	mPutButton = findChild<LLButton>("put_button");
+	llassert(mPutButton != NULL);
+	mPutButton->setCommitCallback(boost::bind(&LLFloaterStinson::onPutClicked, this));
+
+	mWarningColor = LLUIColorTable::instance().getColor("MaterialWarningColor");
+	mErrorColor = LLUIColorTable::instance().getColor("MaterialErrorColor");
+
+	setState(kNoRegion);
+
+	return LLFloater::postBuild();
+}
+
+void LLFloaterStinson::onOpen(const LLSD& pKey)
+{
+	LLFloater::onOpen(pKey);
+
+	if (!mRegionCrossConnection.connected())
+	{
+		mRegionCrossConnection = LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterStinson::onRegionCross, this));
+	}
+
+	if (!mTeleportFailedConnection.connected())
+	{
+		mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->setTeleportFailedCallback(boost::bind(&LLFloaterStinson::onRegionCross, this));
+	}
+
+	checkRegionMaterialStatus();
+}
+
+void LLFloaterStinson::onClose(bool pIsAppQuitting)
+{
+	if (mTeleportFailedConnection.connected())
+	{
+		mTeleportFailedConnection.disconnect();
+	}
+
+	if (mRegionCrossConnection.connected())
+	{
+		mRegionCrossConnection.disconnect();
+	}
+
+	LLFloater::onClose(pIsAppQuitting);
+}
+
+LLFloaterStinson::LLFloaterStinson(const LLSD& pParams)
+	: LLFloater(pParams),
+	mStatusText(NULL),
+	mGetButton(NULL),
+	mPutButton(NULL),
+	mState(kNoRegion),
+	mWarningColor(),
+	mErrorColor(),
+	mRegionCrossConnection(),
+	mTeleportFailedConnection()
+{
+}
+
+LLFloaterStinson::~LLFloaterStinson()
+{
+}
+
+void LLFloaterStinson::onGetClicked()
+{
+	requestGetMaterials();
+}
+
+void LLFloaterStinson::onPutClicked()
+{
+	requestPutMaterials();
+}
+
+void LLFloaterStinson::onRegionCross()
+{
+	checkRegionMaterialStatus();
+}
+
+void LLFloaterStinson::onDeferredCheckRegionMaterialStatus(LLUUID regionId)
+{
+	checkRegionMaterialStatus(regionId);
+}
+
+void LLFloaterStinson::onDeferredRequestGetMaterials(LLUUID regionId)
+{
+	requestGetMaterials(regionId);
+}
+
+void LLFloaterStinson::onDeferredRequestPutMaterials(LLUUID regionId)
+{
+	requestPutMaterials(regionId);
+}
+
+void LLFloaterStinson::onGetResponse(bool pRequestStatus, const LLSD& pContent)
+{
+	if (pRequestStatus)
+	{
+		setState(kRequestCompleted);
+		parseResponse("GET", pContent);
+	}
+	else
+	{
+		setState(kError);
+	}
+}
+
+void LLFloaterStinson::onPutResponse(bool pRequestStatus, const LLSD& pContent)
+{
+	if (pRequestStatus)
+	{
+		setState(kRequestCompleted);
+		parseResponse("PUT", pContent);
+	}
+	else
+	{
+		setState(kError);
+	}
+}
+
+void LLFloaterStinson::checkRegionMaterialStatus()
+{
+	LLViewerRegion *region = gAgent.getRegion();
+
+	if (region == NULL)
+	{
+		llwarns << "Region is NULL" << llendl;
+		setState(kNoRegion);
+	}
+	else if (!region->capabilitiesReceived())
+	{
+		setState(kCapabilitiesLoading);
+		region->setCapabilitiesReceivedCallback(boost::bind(&LLFloaterStinson::onDeferredRequestGetMaterials, this, region->getRegionID()));
+	}
+	else
+	{
+		std::string capURL = region->getCapability(MATERIALS_CAPABILITY_NAME);
+
+		if (capURL.empty())
+		{
+			llwarns << "Capability '" << MATERIALS_CAPABILITY_NAME << "' is not defined on the current region '"
+				<< region->getName() << "'" << llendl;
+			setState(kNotEnabled);
+		}
+		else
+		{
+			setState(kReady);
+		}
+	}
+}
+
+void LLFloaterStinson::checkRegionMaterialStatus(const LLUUID& regionId)
+{
+	const LLViewerRegion *region = gAgent.getRegion();
+
+	if ((region != NULL) && (region->getRegionID() == regionId))
+	{
+		checkRegionMaterialStatus();
+	}
+}
+
+void LLFloaterStinson::requestGetMaterials()
+{
+	LLViewerRegion *region = gAgent.getRegion();
+
+	if (region == NULL)
+	{
+		llwarns << "Region is NULL" << llendl;
+		setState(kNoRegion);
+	}
+	else if (!region->capabilitiesReceived())
+	{
+		setState(kCapabilitiesLoading);
+		region->setCapabilitiesReceivedCallback(boost::bind(&LLFloaterStinson::onDeferredRequestGetMaterials, this, region->getRegionID()));
+	}
+	else
+	{
+		std::string capURL = region->getCapability(MATERIALS_CAPABILITY_NAME);
+
+		if (capURL.empty())
+		{
+			llwarns << "Capability '" << MATERIALS_CAPABILITY_NAME << "' is not defined on the current region '"
+				<< region->getName() << "'" << llendl;
+			setState(kNotEnabled);
+		}
+		else
+		{
+			setState(kRequestStarted);
+			LLHTTPClient::ResponderPtr materialsResponder = new MaterialsGetResponder(capURL, boost::bind(&LLFloaterStinson::onGetResponse, this, _1, _2));
+			llinfos << "STINSON DEBUG: sending request GET to capability '" << MATERIALS_CAPABILITY_NAME
+				<< "' with url '" << capURL << "'" << llendl;
+			LLHTTPClient::get(capURL, materialsResponder);
+		}
+	}
+}
+
+void LLFloaterStinson::requestGetMaterials(const LLUUID& regionId)
+{
+	const LLViewerRegion *region = gAgent.getRegion();
+
+	if ((region != NULL) && (region->getRegionID() == regionId))
+	{
+		requestGetMaterials();
+	}
+}
+
+void LLFloaterStinson::requestPutMaterials()
+{
+	LLViewerRegion *region = gAgent.getRegion();
+
+	if (region == NULL)
+	{
+		llwarns << "Region is NULL" << llendl;
+		setState(kNoRegion);
+	}
+	else if (!region->capabilitiesReceived())
+	{
+		setState(kCapabilitiesLoading);
+		region->setCapabilitiesReceivedCallback(boost::bind(&LLFloaterStinson::onDeferredRequestPutMaterials, this, region->getRegionID()));
+	}
+	else
+	{
+		std::string capURL = region->getCapability(MATERIALS_CAPABILITY_NAME);
+
+		if (capURL.empty())
+		{
+			llwarns << "Capability '" << MATERIALS_CAPABILITY_NAME << "' is not defined on the current region '"
+				<< region->getName() << "'" << llendl;
+			setState(kNotEnabled);
+		}
+		else
+		{
+			setState(kRequestStarted);
+
+			LLSD facesData  = LLSD::emptyArray();
+
+			LLObjectSelectionHandle selectionHandle = LLSelectMgr::getInstance()->getEditSelection();
+			for (LLObjectSelection::valid_iterator objectIter = selectionHandle->valid_begin();
+				objectIter != selectionHandle->valid_end(); ++objectIter)
+			{
+				LLSelectNode* objectNode = *objectIter;
+				LLViewerObject* viewerObject = objectNode->getObject();
+				
+				LLSD faceData = LLSD::emptyMap();
+				faceData[MATERIALS_CAP_FACE_FIELD] = static_cast<LLSD::Integer>(0);
+				faceData[MATERIALS_CAP_MATERIAL_FIELD] = static_cast<LLSD::Integer>(0);
+				faceData[MATERIALS_CAP_OBJECT_ID_FIELD] = viewerObject->getID();
+
+				facesData.append(faceData);
+			}
+
+			LLSD putData = LLSD::emptyMap();
+			putData[MATERIALS_CAP_FULL_PER_FACE_FIELD] = facesData;
+
+			LLHTTPClient::ResponderPtr materialsResponder = new MaterialsPutResponder(capURL, boost::bind(&LLFloaterStinson::onPutResponse, this, _1, _2));
+			llinfos << "STINSON DEBUG: sending request PUT to capability '" << MATERIALS_CAPABILITY_NAME
+				<< "' with url '" << capURL << "' and with data " << putData << llendl;
+			LLHTTPClient::put(capURL, putData, materialsResponder);
+		}
+	}
+}
+
+void LLFloaterStinson::requestPutMaterials(const LLUUID& regionId)
+{
+	const LLViewerRegion *region = gAgent.getRegion();
+
+	if ((region != NULL) && (region->getRegionID() == regionId))
+	{
+		requestPutMaterials();
+	}
+}
+
+void LLFloaterStinson::parseResponse(const std::string& pRequestType, const LLSD& pContent) const
+{
+	llinfos << "--------------------------------------------------------------------------" << llendl;
+	llinfos << pRequestType << " Response: '" << pContent << "'" << llendl;
+	llinfos << "--------------------------------------------------------------------------" << llendl;
+}
+
+void LLFloaterStinson::setState(EState pState)
+{
+	mState = pState;
+	updateStatusMessage();
+	updateControls();
+}
+
+void LLFloaterStinson::updateStatusMessage()
+{
+	std::string statusText;
+	LLStyle::Params styleParams;
+
+	switch (getState())
+	{
+	case kNoRegion :
+		statusText = getString("status_no_region");
+		styleParams.color = mErrorColor;
+		break;
+	case kCapabilitiesLoading :
+		statusText = getString("status_capabilities_loading");
+		styleParams.color = mWarningColor;
+		break;
+	case kReady :
+		statusText = getString("status_ready");
+		break;
+	case kRequestStarted :
+		statusText = getString("status_request_started");
+		styleParams.color = mWarningColor;
+		break;
+	case kRequestCompleted :
+		statusText = getString("status_request_completed");
+		break;
+	case kNotEnabled :
+		statusText = getString("status_not_enabled");
+		styleParams.color = mErrorColor;
+		break;
+	case kError :
+		statusText = getString("status_error");
+		styleParams.color = mErrorColor;
+		break;
+	default :
+		statusText = getString("status_ready");
+		llassert(0);
+		break;
+	}
+
+	mStatusText->setText((LLStringExplicit)statusText, styleParams);
+}
+
+void LLFloaterStinson::updateControls()
+{
+	switch (getState())
+	{
+	case kNoRegion :
+	case kCapabilitiesLoading :
+	case kRequestStarted :
+	case kNotEnabled :
+		mGetButton->setEnabled(FALSE);
+		break;
+	case kReady :
+	case kRequestCompleted :
+	case kError :
+		mGetButton->setEnabled(TRUE);
+		break;
+	default :
+		mGetButton->setEnabled(TRUE);
+		llassert(0);
+		break;
+	}
+}
+
+MaterialsGetResponder::MaterialsGetResponder(const std::string& pCapabilityURL, CallbackFunction pCallback)
+	: LLHTTPClient::Responder(),
+	mCapabilityURL(pCapabilityURL),
+	mCallback(pCallback)
+{
+}
+
+MaterialsGetResponder::~MaterialsGetResponder()
+{
+}
+
+void MaterialsGetResponder::result(const LLSD& pContent)
+{
+	mCallback(true, pContent);
+}
+
+void MaterialsGetResponder::error(U32 pStatus, const std::string& pReason)
+{
+	llwarns << "--------------------------------------------------------------------------" << llendl;
+	llwarns << "GET Error[" << pStatus << "] cannot access cap '" << MATERIALS_CAPABILITY_NAME
+		<< "' with url '" << mCapabilityURL	<< "' because " << pReason << llendl;
+	llwarns << "--------------------------------------------------------------------------" << llendl;
+
+	LLSD emptyResult;
+	mCallback(false, emptyResult);
+}
+
+MaterialsPutResponder::MaterialsPutResponder(const std::string& pCapabilityURL, CallbackFunction pCallback)
+	: LLHTTPClient::Responder(),
+	mCapabilityURL(pCapabilityURL),
+	mCallback(pCallback)
+{
+}
+
+MaterialsPutResponder::~MaterialsPutResponder()
+{
+}
+
+void MaterialsPutResponder::result(const LLSD& pContent)
+{
+	mCallback(true, pContent);
+}
+
+void MaterialsPutResponder::error(U32 pStatus, const std::string& pReason)
+{
+	llwarns << "--------------------------------------------------------------------------" << llendl;
+	llwarns << "PUT Error[" << pStatus << "] cannot access cap '" << MATERIALS_CAPABILITY_NAME
+		<< "' with url '" << mCapabilityURL	<< "' because " << pReason << llendl;
+	llwarns << "--------------------------------------------------------------------------" << llendl;
+
+	LLSD emptyResult;
+	mCallback(false, emptyResult);
+}
diff --git a/indra/newview/llfloaterstinson.h b/indra/newview/llfloaterstinson.h
new file mode 100644
index 0000000000000000000000000000000000000000..1aeb6bbd233b3495ec5ef2e8aa24984a3f67921e
--- /dev/null
+++ b/indra/newview/llfloaterstinson.h
@@ -0,0 +1,111 @@
+/** 
+* @file   llfloaterstinson.h
+* @brief  Header file for llfloaterstinson
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLFLOATERSTINSON_H
+#define LL_LLFLOATERSTINSON_H
+
+#include <boost/signals2.hpp>
+
+#include "llfloater.h"
+#include "lluuid.h"
+#include "v4color.h"
+
+class LLButton;
+class LLSD;
+class LLTextBase;
+
+class LLFloaterStinson : public LLFloater
+{
+public:
+	virtual BOOL postBuild();
+
+	virtual void onOpen(const LLSD& pKey);
+	virtual void onClose(bool pIsAppQuitting);
+
+protected:
+
+private:
+	friend class LLFloaterReg;
+
+	typedef enum {
+		kNoRegion,
+		kCapabilitiesLoading,
+		kReady,
+		kRequestStarted,
+		kRequestCompleted,
+		kNotEnabled,
+		kError
+	} EState;
+
+	LLFloaterStinson(const LLSD& pParams);
+	virtual ~LLFloaterStinson();
+
+	void          onGetClicked();
+	void          onPutClicked();
+	void          onRegionCross();
+	void          onDeferredCheckRegionMaterialStatus(LLUUID regionId);
+	void          onDeferredRequestGetMaterials(LLUUID regionId);
+	void          onDeferredRequestPutMaterials(LLUUID regionId);
+	void          onGetResponse(bool pRequestStatus, const LLSD& pContent);
+	void          onPutResponse(bool pRequestStatus, const LLSD& pContent);
+
+	void          checkRegionMaterialStatus();
+	void          checkRegionMaterialStatus(const LLUUID& regionId);
+
+	void          requestGetMaterials();
+	void          requestGetMaterials(const LLUUID& regionId);
+
+	void          requestPutMaterials();
+	void          requestPutMaterials(const LLUUID& regionId);
+
+	void          parseResponse(const std::string& pRequestType, const LLSD& pContent) const;
+
+	void          setState(EState pState);
+	inline EState getState() const;
+
+	void          updateStatusMessage();
+	void          updateControls();
+
+	LLTextBase*                 mStatusText;
+	LLButton*                   mGetButton;
+	LLButton*                   mPutButton;
+
+	EState                      mState;
+	LLColor4                    mWarningColor;
+	LLColor4                    mErrorColor;
+
+	boost::signals2::connection mRegionCrossConnection;
+	boost::signals2::connection mTeleportFailedConnection;
+};
+
+
+
+LLFloaterStinson::EState LLFloaterStinson::getState() const
+{
+	return mState;
+}
+
+#endif // LL_LLFLOATERSTINSON_H
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 1f7cf0cdd449b9e6d76362e472d93866039dd7c8..9314a3794bf2fbe00424387ee73cc148fe1ec612 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -103,6 +103,7 @@
 #include "llfloatersnapshot.h"
 #include "llfloatersounddevices.h"
 #include "llfloaterspellchecksettings.h"
+#include "llfloaterstinson.h"
 #include "llfloatertelehub.h"
 #include "llfloatertestinspectors.h"
 #include "llfloatertestlistview.h"
@@ -255,6 +256,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("pathfinding_characters", "floater_pathfinding_characters.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingCharacters>);
 	LLFloaterReg::add("pathfinding_linksets", "floater_pathfinding_linksets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingLinksets>);
 	LLFloaterReg::add("pathfinding_console", "floater_pathfinding_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingConsole>);
+	LLFloaterReg::add("floater_stinson", "floater_stinson.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterStinson>);
 	LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
 	LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
 	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index effa368b7ac251e6603e7ba4edd945b1f1f5c561..755879f591baa80c21409ffe52141fb67f25ef8d 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1558,6 +1558,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
 	capabilityNames.append("ProductInfoRequest");
 	capabilityNames.append("ProvisionVoiceAccountRequest");
 	capabilityNames.append("RemoteParcelRequest");
+	capabilityNames.append("RenderMaterials");
 	capabilityNames.append("RequestTextureDownload");
 	capabilityNames.append("ResourceCostSelected");
 	capabilityNames.append("RetrieveNavMeshSrc");
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 9bf2922033fcdd5c5a127dcc32da1510a8f5c3ae..48a9430fdc639dafbfea0148d06a324d61574d0f 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -644,6 +644,15 @@
   <color
       name="PathfindingGoodColor"
       reference="LtGreen" />
+  <color
+      name="MaterialErrorColor"
+      reference="LtRed" />
+  <color
+      name="MaterialWarningColor"
+      reference="DrYellow" />
+  <color
+      name="MaterialGoodColor"
+      reference="LtGreen" />
   <color
       name="PathfindingDefaultBeaconColor"
       reference="Red_80" />
diff --git a/indra/newview/skins/default/xui/en/floater_stinson.xml b/indra/newview/skins/default/xui/en/floater_stinson.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0ec6b281cf30ea5727d6ba026f5f78fc65b9dd23
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_stinson.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+    positioning="cascading"
+    can_tear_off="false"
+    height="160"
+    layout="topleft"
+    name="floater_stinson"
+    help_topic="floater_stinson"
+    reuse_instance="true"
+    save_rect="true"
+    single_instance="true"
+    title="Stinson Test"
+    width="240">
+  <floater.string name="status_no_region">No current region available.</floater.string>
+  <floater.string name="status_capabilities_loading">Region capabilities are loading.</floater.string>
+  <floater.string name="status_ready">Materials are enabled for this region.</floater.string>
+  <floater.string name="status_request_started">Request sent.</floater.string>
+  <floater.string name="status_request_completed">Request received.</floater.string>
+  <floater.string name="status_not_enabled">Materials are not enabled for this region.</floater.string>
+  <floater.string name="status_error">An error occurred during the request.</floater.string>
+  <panel
+      border="false"
+      bevel_style="none"
+      follows="left|top"
+      layout="topleft"
+      left="12"
+      top_pad="10"
+      height="61"
+      width="214">
+    <text
+        height="13"
+        word_wrap="true"
+        use_ellipses="false"
+        type="string"
+        text_color="LabelTextColor"
+        length="1"
+        layout="topleft"
+        left="0"
+        top_pad="0"
+        width="214">
+      Status
+    </text>
+    <text
+        height="40"
+        word_wrap="true"
+        use_ellipses="false"
+        type="string"
+        text_color="MaterialGoodColor"
+        length="1"
+        follows="left|top"
+        layout="topleft"
+        left="0"
+        name="material_status"
+        top_pad="8"
+        width="214">
+    </text>
+  </panel>
+  <view_border
+      bevel_style="none"
+      follows="left|right|bottom"
+      height="0"
+      layout="topleft"
+      name="horiz_separator"
+      top_pad="0"
+      left="12"
+      width="214"/>
+  <panel
+      border="false"
+      bevel_style="none"
+      follows="left|top"
+      layout="topleft"
+      left="12"
+      top_pad="10"
+      height="61"
+      width="214">
+    <button
+        follows="left|top"
+        height="22"
+        label="Get"
+        layout="topleft"
+        name="get_button"
+        top_pad="0"
+        width="214"/>
+    <button
+        follows="left|top"
+        height="22"
+        label="Put"
+        layout="topleft"
+        name="put_button"
+        top_pad="12"
+        width="214"/>
+  </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 1aa55acf2d8a573bf75b23d3113b09c88fa468d2..e94253fcf6634ab089140b5b078e850f1378d88d 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -987,6 +987,16 @@
       </menu>
 
 
+      <menu_item_separator/>
+
+      <menu_item_call
+          label="Stinson"
+          name="StinsonMenu">
+        <menu_item_call.on_click
+            function="Floater.ToggleOrBringToFront"
+            parameter="floater_stinson" />
+      </menu_item_call>
+
       <menu_item_separator/>
 
         <menu