diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp
index 0ab10812006c41c75ca77569927e9966bafafee4..c3a786d59c6b8d0f6396ba974a0c8222dca51d87 100644
--- a/indra/llmessage/llassetstorage.cpp
+++ b/indra/llmessage/llassetstorage.cpp
@@ -283,28 +283,30 @@ LLEstateAssetRequest::~LLEstateAssetRequest()
 // TODO: rework tempfile handling?
 
 
-LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, const LLHost &upstream_host)
+LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host)
 {
-	_init(msg, xfer, vfs, upstream_host);
+	_init(msg, xfer, vfs, static_vfs, upstream_host);
 }
 
 
 LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-							   LLVFS *vfs)
+							   LLVFS *vfs, LLVFS *static_vfs)
 {
-	_init(msg, xfer, vfs, LLHost::invalid);
+	_init(msg, xfer, vfs, static_vfs, LLHost::invalid);
 }
 
 
 void LLAssetStorage::_init(LLMessageSystem *msg,
 						   LLXferManager *xfer,
 						   LLVFS *vfs,
+						   LLVFS *static_vfs,
 						   const LLHost &upstream_host)
 {
 	mShutDown = FALSE;
 	mMessageSys = msg;
 	mXferManager = xfer;
 	mVFS = vfs;
+	mStaticVFS = static_vfs;
 
 	setUpstream(upstream_host);
 	msg->setHandlerFuncFast(_PREHASH_AssetUploadComplete, processUploadComplete, (void **)this);
@@ -396,7 +398,7 @@ void LLAssetStorage::_cleanupRequests(BOOL all, S32 error)
 
 BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType type)
 {
-	return mVFS->getExists(uuid, type);
+	return mStaticVFS->getExists(uuid, type) || mVFS->getExists(uuid, type);
 }
 
 ///////////////////////////////////////////////////////////////////////////
@@ -423,11 +425,48 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo
 		return;
 	}
 
+	{
+		// Try in static VFS first.
+		BOOL exists = mStaticVFS->getExists(uuid, type);
+		//exists = false;
+		if (exists)
+		{
+			LLVFile file(mStaticVFS, uuid, type);
+			U32 size = exists ? file.getSize() : 0;
+			if (size>0)
+			{
+				// we've already got the file
+				// theoretically, partial files w/o a pending request shouldn't happen
+				// unless there's a weird error
+				if (callback)
+				{
+					callback(mStaticVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
+				}
+				return;
+			}
+			else
+			{
+				llwarns << "Asset vfile " << uuid << ":" << type
+						<< " found in static VFS with bad size " << file.getSize() << ", ignoring" << llendl;
+			}
+		}
+	}
+
 	BOOL exists = mVFS->getExists(uuid, type);
 	LLVFile file(mVFS, uuid, type);
 	U32 size = exists ? file.getSize() : 0;
 	
-	if (size < 1)
+	if (size > 0)
+	{
+		// we've already got the file
+		// theoretically, partial files w/o a pending request shouldn't happen
+		// unless there's a weird error
+		if (callback)
+		{
+			callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
+		}
+	}
+	else
 	{
 		if (exists)
 		{
@@ -466,16 +505,6 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo
 		// This can be overridden by subclasses
 		_queueDataRequest(uuid, type, callback, user_data, duplicate, is_priority);	
 	}
-	else
-	{
-		// we've already got the file
-		// theoretically, partial files w/o a pending request shouldn't happen
-		// unless there's a weird error
-		if (callback)
-		{
-			callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
-		}
-	}
 }
 
 void LLAssetStorage::_queueDataRequest(const LLUUID& uuid, LLAssetType::EType atype,
@@ -620,7 +649,17 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen
 	LLVFile file(mVFS, asset_id, atype);
 	U32 size = exists ? file.getSize() : 0;
 
-	if (size < 1)
+	if (size > 0)
+	{
+		// we've already got the file
+		// theoretically, partial files w/o a pending request shouldn't happen
+		// unless there's a weird error
+		if (callback)
+		{
+			callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
+		}
+	}
+	else
 	{
 		if (exists)
 		{
@@ -671,16 +710,6 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen
 			}
 		}
 	}
-	else
-	{
-		// we've already got the file
-		// theoretically, partial files w/o a pending request shouldn't happen
-		// unless there's a weird error
-		if (callback)
-		{
-			callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
-		}
-	}
 }
 
 void LLAssetStorage::downloadEstateAssetCompleteCallback(
@@ -758,7 +787,17 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age
 
 	}
 
-	if (size < 1)
+	if (size > 0)
+	{
+		// we've already got the file
+		// theoretically, partial files w/o a pending request shouldn't happen
+		// unless there's a weird error
+		if (callback)
+		{
+			callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
+		}
+	}
+	else
 	{
 		// See whether we should talk to the object's originating sim,
 		// or the upstream provider.
@@ -807,16 +846,6 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age
 			}
 		}
 	}
-	else
-	{
-		// we've already got the file
-		// theoretically, partial files w/o a pending request shouldn't happen
-		// unless there's a weird error
-		if (callback)
-		{
-			callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
-		}
-	}
 }
 
 
diff --git a/indra/llmessage/llassetstorage.h b/indra/llmessage/llassetstorage.h
index 83cfdf6110f990c2fe75fe6d491c2f683be5fbad..979ce14ad08b96d9039bdae30c1592b281b0df78 100644
--- a/indra/llmessage/llassetstorage.h
+++ b/indra/llmessage/llassetstorage.h
@@ -218,6 +218,7 @@ class LLAssetStorage : public LLTempAssetStorage
 public:
 	// VFS member is public because static child methods need it :(
 	LLVFS *mVFS;
+	LLVFS *mStaticVFS;
 	typedef void (*LLStoreAssetCallback)(const LLUUID &asset_id, void *user_data, S32 status, LLExtStat ext_status);
 
 	enum ERequestType
@@ -247,10 +248,10 @@ class LLAssetStorage : public LLTempAssetStorage
 
 public:
 	LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-				   LLVFS *vfs, const LLHost &upstream_host);
+				   LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host);
 
 	LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-				   LLVFS *vfs);
+				   LLVFS *vfs, LLVFS *static_vfs);
 	virtual ~LLAssetStorage();
 
 	void setUpstream(const LLHost &upstream_host);
@@ -442,6 +443,7 @@ class LLAssetStorage : public LLTempAssetStorage
 	void _init(LLMessageSystem *msg,
 			   LLXferManager *xfer,
 			   LLVFS *vfs,
+			   LLVFS *static_vfs,
 			   const LLHost &upstream_host);
 
 protected:
diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp
index 1980735bbb79ae66396c4c2ebba770d83d81dc1b..fc326790eb7d880c6e07cf9c7c54bbcae96aa2e9 100644
--- a/indra/llmessage/llhttpassetstorage.cpp
+++ b/indra/llmessage/llhttpassetstorage.cpp
@@ -401,21 +401,23 @@ size_t LLHTTPAssetRequest::curlCompressedUploadCallback(
 
 
 LLHTTPAssetStorage::LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-									 LLVFS *vfs, const LLHost &upstream_host,
+									 LLVFS *vfs, LLVFS *static_vfs, 
+									 const LLHost &upstream_host,
 									 const std::string& web_host,
 									 const std::string& local_web_host,
 									 const std::string& host_name)
-	: LLAssetStorage(msg, xfer, vfs, upstream_host)
+	: LLAssetStorage(msg, xfer, vfs, static_vfs, upstream_host)
 {
 	_init(web_host, local_web_host, host_name);
 }
 
 LLHTTPAssetStorage::LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
 									   LLVFS *vfs,
+									   LLVFS *static_vfs,
 									   const std::string& web_host,
 									   const std::string& local_web_host,
 									   const std::string& host_name)
-	: LLAssetStorage(msg, xfer, vfs)
+	: LLAssetStorage(msg, xfer, vfs, static_vfs)
 {
 	_init(web_host, local_web_host, host_name);
 }
diff --git a/indra/llmessage/llhttpassetstorage.h b/indra/llmessage/llhttpassetstorage.h
index 231437dad41931135add7f0e7499fb13436c3b73..3e85e898e2cbd58666caf094a9a3285629483b16 100644
--- a/indra/llmessage/llhttpassetstorage.h
+++ b/indra/llmessage/llhttpassetstorage.h
@@ -48,13 +48,14 @@ class LLHTTPAssetStorage : public LLAssetStorage
 {
 public:
 	LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-					   LLVFS *vfs, const LLHost &upstream_host,
+					   LLVFS *vfs, LLVFS *static_vfs,
+					   const LLHost &upstream_host,
 					   const std::string& web_host,
 					   const std::string& local_web_host,
 					   const std::string& host_name);
 
 	LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-					   LLVFS *vfs,
+					   LLVFS *vfs, LLVFS *static_vfs,
 					   const std::string& web_host,
 					   const std::string& local_web_host,
 					   const std::string& host_name);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f19a33301ad5d2c5e0e5b1b190f2d097989ef225..7895cee4ec71f38008a33c4f229095027521ea5a 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3238,6 +3238,13 @@ bool LLAppViewer::initCache()
 	else
 	{
 		LLVFile::initClass();
+
+		llinfos << "Static VFS listing" << llendl;
+		gStaticVFS->listFiles();
+
+		llinfos << "regular VFS listing" << llendl;
+		gVFS->listFiles();
+		
 		return true;
 	}
 }
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index d4d6a74f0c665d6c1416efd5da91174131287d68..0eae134983ff6aece62eb72bdd026cb82be8d0ac 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -561,7 +561,7 @@ bool idle_startup()
 				gXferManager->setUseAckThrottling(TRUE);
 				gXferManager->setAckThrottleBPS(xfer_throttle_bps);
 			}
-			gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS);
+			gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS, gStaticVFS);
 
 
 			F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage");
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index bb49804aff0162b1acaf11d1ac6385c53ea4c8d2..c3a6b7111b64916a6bb882e51776ad8b89bce493 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -41,15 +41,16 @@
 #include "llagent.h"
 
 LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-										   LLVFS *vfs, const LLHost &upstream_host)
-		: LLAssetStorage(msg, xfer, vfs, upstream_host)
+										   LLVFS *vfs, LLVFS *static_vfs, 
+										   const LLHost &upstream_host)
+		: LLAssetStorage(msg, xfer, vfs, static_vfs, upstream_host)
 {
 }
 
 
 LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-										   LLVFS *vfs)
-		: LLAssetStorage(msg, xfer, vfs)
+										   LLVFS *vfs, LLVFS *static_vfs)
+		: LLAssetStorage(msg, xfer, vfs, static_vfs)
 {
 }
 
diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h
index 512b590a1ba4f6377e23058943c6838836adaec7..8e7ea3471d8913215cc801df3468f3463457f1ae 100644
--- a/indra/newview/llviewerassetstorage.h
+++ b/indra/newview/llviewerassetstorage.h
@@ -42,10 +42,10 @@ class LLViewerAssetStorage : public LLAssetStorage
 {
 public:
 	LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-				   LLVFS *vfs, const LLHost &upstream_host);
+				   LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host);
 
 	LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
-				   LLVFS *vfs);
+				   LLVFS *vfs, LLVFS *static_vfs);
 
 	using LLAssetStorage::storeAssetData;
 	virtual void storeAssetData(