diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index 4304db36bea26b30380a85184f47cc5f45dbd8f7..6ecc2ec74005b6eca29d1b78d3afa5b717cf81b7 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -31,6 +31,9 @@
 #include "llmemory.h"
 #include "llsingleton.h"
 
+#include <set>
+#include <boost/algorithm/string.hpp>
+
 ///----------------------------------------------------------------------------
 /// Class LLAssetType
 ///----------------------------------------------------------------------------
@@ -48,7 +51,8 @@ struct AssetEntry : public LLDictionaryEntry
 		mHumanName(human_name),
 		mCanLink(can_link),
 		mCanFetch(can_fetch),
-		mCanKnow(can_know)
+		mCanKnow(can_know),
+        mFetchWithVACap(false)
 	{
 		llassert(strlen(mTypeName) <= 8);
 	}
@@ -58,6 +62,7 @@ struct AssetEntry : public LLDictionaryEntry
 	bool mCanLink;
 	bool mCanFetch;
 	bool mCanKnow;
+    bool mFetchWithVACap;
 };
 
 class LLAssetDictionary : public LLSingleton<LLAssetDictionary>,
@@ -251,3 +256,89 @@ bool LLAssetType::lookupIsAssetIDKnowable(EType asset_type)
 	}
 	return false;
 }
+
+// static
+bool LLAssetType::lookupFetchWithVACap(EType asset_type)
+{
+	LLAssetDictionary *dict = LLAssetDictionary::getInstance();
+	const AssetEntry *entry = dict->lookup(asset_type);
+	if (entry)
+	{
+		return entry->mFetchWithVACap;
+	}
+	return false;
+}
+
+// FIXME asset-http yank all this after asset-http becomes universal
+void LLAssetType::setFetchWithVACapTypeString(const std::string& type_string)
+{
+	LLAssetDictionary *dict = LLAssetDictionary::getInstance();
+    if (type_string=="none")
+    {
+        for (LLAssetDictionary::iterator iter = dict->begin();
+             iter != dict->end();
+             iter++)
+        {
+            AssetEntry *entry = iter->second;
+            entry->mFetchWithVACap = false;
+        } 
+    }
+    else if (type_string=="all")
+    {
+        for (LLAssetDictionary::iterator iter = dict->begin();
+             iter != dict->end();
+             iter++)
+        {
+            AssetEntry *entry = iter->second;
+            entry->mFetchWithVACap = true;
+        } 
+    }
+    else
+    {
+        for (LLAssetDictionary::iterator iter = dict->begin();
+             iter != dict->end();
+             iter++)
+        {
+            AssetEntry *entry = iter->second;
+            if (entry->mTypeName==type_string)
+            {
+                entry->mFetchWithVACap = true;
+            }
+        } 
+    }
+}
+
+// FIXME asset-http yank all this after asset-http becomes universal
+void LLAssetType::setFetchWithVACapConfigString(const std::string& config_string)
+{
+    // Clear any currently enabled types
+    LLAssetType::setFetchWithVACapTypeString("none");
+
+    // Enable all types specified in the config string.
+    std::set<std::string> type_names_for_va_cap;
+    boost::split(type_names_for_va_cap, config_string, boost::is_any_of(" :,"));
+    for (std::set<std::string>::const_iterator it = type_names_for_va_cap.begin();
+         it != type_names_for_va_cap.end(); ++it)
+    {
+        const std::string& type_string = *it;
+        LLAssetType::setFetchWithVACapTypeString(type_string);
+    }
+
+	LLAssetDictionary *dict = LLAssetDictionary::getInstance();
+	bool any_found = false;
+    for (LLAssetDictionary::iterator iter = dict->begin();
+         iter != dict->end();
+         iter++)
+    {
+        AssetEntry *entry = iter->second;
+        if (entry->mFetchWithVACap)
+        {
+            any_found = true;
+            LL_WARNS() << "Fetch with ViewerAsset cap enabled for " << entry->mTypeName << LL_ENDL;
+        }
+    } 
+	if (!any_found)
+	{
+		LL_WARNS() << "Fetch with ViewerAsset cap disabled for all types" << LL_ENDL;
+	}
+}
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index 3a4b5dad18cfaae843090ed95809a4921a7b4de7..e06ebc2a350c33129ef733c1db2eec6625463441 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -152,6 +152,11 @@ class LL_COMMON_API LLAssetType
 
 	static bool 				lookupIsAssetFetchByIDAllowed(EType asset_type); // the asset allows direct download
 	static bool 				lookupIsAssetIDKnowable(EType asset_type); // asset data can be known by the viewer
+
+	static bool 				lookupFetchWithVACap(EType asset_type); // asset data is fetched via http using ViewerAsset cap.
+
+    static void					setFetchWithVACapTypeString(const std::string& type_string);
+    static void					setFetchWithVACapConfigString(const std::string& config_string);
 	
 	static const std::string&	badLookup(); // error string when a lookup fails
 
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 9f37c3487e2e04ee7fe0a48fbcad077d7b4446fd..8b899dc8c8986bdd593c162f536a4200ca17d7c9 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -15808,6 +15808,18 @@
       <integer>0</integer>
     </map>
 
+    <key>ViewerAssetHttpTypes</key>
+    <map>
+      <key>Comment</key>
+      <string>Use the ViewerAsset cap and HTTP pipeline for fetching assets of the listed type names. "none" and "all" are recognized as a special values.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string />
+    </map>
+
   <key>SimulateFBOFailure</key>
   <map>
     <key>Comment</key>
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 1bb3d65e051fc394a4bd5abe3f6cd77a5278c0be..38fdaea9d8dffe27f4a51524742ca2bb96aeadd3 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -311,6 +311,16 @@ void set_flags_and_update_appearance()
 // true when all initialization done.
 bool idle_startup()
 {
+    // FIXME asset-http - this configuration stuff is temporary
+    // construction; once it is always on for certain types
+    // and we can remove the setting.
+    static bool va_types_initialized = false;
+    if (!va_types_initialized)
+    {
+        va_types_initialized = true;
+        LLAssetType::setFetchWithVACapConfigString(gSavedSettings.getString("ViewerAssetHttpTypes"));
+    }
+
 	const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");
 	static LLTimer timeout;
 
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index db7184965958c8ef0978d0a9d44f3236357d4855..5b518885472ca0fabbfe3f44e39b26b0b9d61abb 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -127,6 +127,13 @@ static bool handleDebugAvatarJointsChanged(const LLSD& newvalue)
     return true;
 }
 
+static bool handleViewerAssetHttpTypesChanged(const LLSD& newvalue)
+{
+    std::string new_string = newvalue.asString();
+    LLAssetType::setFetchWithVACapConfigString(new_string);
+    return true;
+}
+
 static bool handleSetShaderChanged(const LLSD& newvalue)
 {
 	// changing shader level may invalidate existing cached bump maps, as the shader type determines the format of the bump map it expects - clear and repopulate the bump cache
@@ -750,6 +757,7 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("SpellCheckDictionary")->getSignal()->connect(boost::bind(&handleSpellCheckChanged));
 	gSavedSettings.getControl("LoginLocation")->getSignal()->connect(boost::bind(&handleLoginLocationChanged));
     gSavedSettings.getControl("DebugAvatarJoints")->getCommitSignal()->connect(boost::bind(&handleDebugAvatarJointsChanged, _2));
+    gSavedSettings.getControl("ViewerAssetHttpTypes")->getCommitSignal()->connect(boost::bind(&handleViewerAssetHttpTypesChanged, _2));
 }
 
 #if TEST_CACHED_CONTROL