diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index da1cfc2074b4acd58c651167598d5a68d9b45585..52265e7ad56b28eb630a33dbb03c93d02d802fa3 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -744,6 +744,7 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai
 		return TRUE;
 	}
 	
+#if 0
 	U32 old_face_mask = mVolumep->mFaceMask;
 
 	S32 face_bit = 0;
@@ -941,6 +942,9 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai
 			setTE(te_num, *(old_tes.getTexture(face_mapping[face_bit])));
 		}
 	}
+#else
+	setNumTEs(mVolumep->getNumFaces());
+#endif
 	return TRUE;
 }
 
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 1a1d29ac32475cacea8dd8f5bc7ce459d7ec3290..4ac95fa939e93619f2494fb563a473f8d816128e 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8902,33 +8902,68 @@ LLCullResult::sg_list_t::iterator LLPipeline::endAlphaGroups()
 }
 
 
-void LLPipeline::loadMesh(LLVOVolume* volume, LLUUID mesh_id)
+void LLPipeline::loadMesh(LLVOVolume* vobj, LLUUID mesh_id, S32 detail)
 {
-
 	{
 		LLMutexLock lock(mMeshMutex);
 		//add volume to list of loading meshes
 		mesh_load_map::iterator iter = mLoadingMeshes.find(mesh_id);
 		if (iter != mLoadingMeshes.end())
 		{ //request pending for this mesh, append volume id to list
-			iter->second.insert(volume->getID());
+			iter->second.insert(vobj->getID());
 			return;
 		}
 
 		//first request for this mesh
-		mLoadingMeshes[mesh_id].insert(volume->getID());
+		mLoadingMeshes[mesh_id].insert(vobj->getID());
 	}
 
 	if (gAssetStorage->hasLocalAsset(mesh_id, LLAssetType::AT_MESH))
 	{ //already have asset, load desired LOD in background
-		mPendingMeshes.push_back(new LLMeshThread(mesh_id, volume->getVolume()));
+		mPendingMeshes.push_back(new LLMeshThread(mesh_id, vobj->getVolume()));
 	}
 	else
 	{ //fetch asset and load when done
 		gAssetStorage->getAssetData(mesh_id, LLAssetType::AT_MESH,
-									getMeshAssetCallback, volume->getVolume(), TRUE);
+									getMeshAssetCallback, vobj->getVolume(), TRUE);
 	}
 
+	//do a quick search to see if we can't display something while we wait for this mesh to load
+	LLVolume* volume = vobj->getVolume();
+
+	if (volume)
+	{
+		LLVolumeParams params = volume->getParams();
+
+		LLVolumeLODGroup* group = LLPrimitive::getVolumeManager()->getGroup(params);
+
+		if (group)
+		{
+			//first see what the next lowest LOD available might be
+			for (S32 i = detail-1; i >= 0; --i)
+			{
+				LLVolume* lod = group->refLOD(i);
+				if (lod && lod->getNumVolumeFaces() > 0)
+				{
+					volume->copyVolumeFaces(lod);
+					group->derefLOD(lod);
+					return;
+				}
+			}
+
+			//no lower LOD is a available, is a higher lod available?
+			for (S32 i = detail+1; i < 4; ++i)
+			{
+				LLVolume* lod = group->refLOD(i);
+				if (lod && lod->getNumVolumeFaces() > 0)
+				{
+					volume->copyVolumeFaces(lod);
+					group->derefLOD(lod);
+					return;
+				}
+			}
+		}
+	}
 }
 
 //static
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index bf654f88b15b6f3d10f20d7b0cc3fa6d9f3433bc..3300f866e3febcd583108163166730c86275c8ed 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -280,7 +280,7 @@ public:
 	
 
 	//mesh management functions
-	void loadMesh(LLVOVolume* volume, LLUUID mesh_id);
+	void loadMesh(LLVOVolume* volume, LLUUID mesh_id, S32 detail = 0);
 	
 	void addTrianglesDrawn(S32 count);
 	BOOL hasRenderType(const U32 type) const				{ return (type && (mRenderTypeMask & (1<<type))) ? TRUE : FALSE; }