diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 84da1b3c62bc0faa40dcc7d1602e5c6337aad8d7..515b1061f93466578db68e296cd6e9d08b08fe84 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -1676,6 +1676,7 @@ LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL ge
 	mFaceMask = 0x0;
 	mDetail = detail;
 	mSculptLevel = -2;
+	mIsTetrahedron = FALSE;
 	mLODScaleBias.setVec(1,1,1);
 
 	// set defaults
@@ -1905,7 +1906,7 @@ BOOL LLVolume::createVolumeFacesFromFile(const std::string& file_name)
 BOOL LLVolume::createVolumeFacesFromStream(std::istream& is)
 {
 	mSculptLevel = -1;  // default is an error occured
-	
+
 	LLSD header;
 	{
 		if (!LLSDSerialize::deserialize(header, is, 1024*1024*1024))
@@ -2048,6 +2049,11 @@ BOOL LLVolume::createVolumeFacesFromStream(std::istream& is)
 	{
 		U32 face_count = mdl.size();
 
+		if (face_count == 0)
+		{
+			llerrs << "WTF?" << llendl;
+		}
+
 		mVolumeFaces.resize(face_count);
 
 		for (U32 i = 0; i < face_count; ++i)
@@ -2063,8 +2069,9 @@ BOOL LLVolume::createVolumeFacesFromStream(std::istream& is)
 
 			//copy out indices
 			face.mIndices.resize(idx.size()/2);
-			if (idx.empty())
+			if (idx.empty() || face.mIndices.size() < 3)
 			{ //why is there an empty index list?
+				llerrs <<"WTF?" << llendl;
 				continue;
 			}
 
@@ -2150,6 +2157,11 @@ void tetrahedron_set_normal(LLVolumeFace::VertexData* cv)
 	cv[2].mNormal = nrm;
 }
 
+BOOL LLVolume::isTetrahedron()
+{
+	return mIsTetrahedron;
+}
+
 void LLVolume::makeTetrahedron()
 {
 	mVolumeFaces.clear();
@@ -2165,6 +2177,9 @@ void LLVolume::makeTetrahedron()
 		LLVector3(x,-x,-x)
 	};
 
+	face.mExtents[0].setVec(-x,-x,-x);
+	face.mExtents[1].setVec(x,x,x);
+	
 	LLVolumeFace::VertexData cv[3];
 
 	//set texture coordinates
@@ -2225,12 +2240,19 @@ void LLVolume::makeTetrahedron()
 	
 	mVolumeFaces.push_back(face);
 	mSculptLevel = 0;
+	mIsTetrahedron = TRUE;
 }
 
 void LLVolume::copyVolumeFaces(LLVolume* volume)
 {
+	if (volume->isTetrahedron())
+	{
+		llerrs << "WTF?" << llendl;
+	}
+
 	mVolumeFaces = volume->mVolumeFaces;
 	mSculptLevel = 0;
+	mIsTetrahedron = FALSE;
 }
 
 S32 const LL_SCULPT_MESH_MAX_FACES = 8;
@@ -2615,6 +2637,11 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
 	LLMemType m1(LLMemType::MTYPE_VOLUME);
     U8 sculpt_type = mParams.getSculptType();
 
+	if (sculpt_type & LL_SCULPT_TYPE_MASK == LL_SCULPT_TYPE_MESH)
+	{
+		llerrs << "WTF?" << llendl;
+	}
+
 	BOOL data_is_empty = FALSE;
 
 	if (sculpt_width == 0 || sculpt_height == 0 || sculpt_components < 3 || sculpt_data == NULL)
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index bf2854ede96081fb92b4f3304d408a948880b6dc..8e57f2e280770ea31736b7aeea0b3a9c124514a4 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -904,7 +904,8 @@ class LLVolume : public LLRefCount
 	BOOL isUnique() const									{ return mUnique; }
 
 	S32 getSculptLevel() const                              { return mSculptLevel; }
-	
+	void setSculptLevel(S32 level)							{ mSculptLevel = level; }
+
 	S32 *getTriangleIndices(U32 &num_indices) const;
 
 	// returns number of triangle indeces required for path/profile mesh
@@ -970,11 +971,13 @@ class LLVolume : public LLRefCount
 	virtual BOOL createVolumeFacesFromFile(const std::string& file_name);
 	virtual BOOL createVolumeFacesFromStream(std::istream& is);
 	virtual void makeTetrahedron();
+	virtual BOOL isTetrahedron();
 
  protected:
 	BOOL mUnique;
 	F32 mDetail;
 	S32 mSculptLevel;
+	BOOL mIsTetrahedron;
 	
 	LLVolumeParams mParams;
 	LLPath *mPathp;
diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp
index 61c5a0adc90bd187030ffc7f03c4eb863bbf1aee..419e0015ba78faaf435806f5c4ba9c3f048b2e5b 100644
--- a/indra/llmath/llvolumemgr.cpp
+++ b/indra/llmath/llvolumemgr.cpp
@@ -375,6 +375,19 @@ F32 LLVolumeLODGroup::getVolumeScaleFromDetail(const S32 detail)
 	return mDetailScales[detail];
 }
 
+S32 LLVolumeLODGroup::getVolumeDetailFromScale(const F32 detail)
+{
+	for (S32 i = 1; i < 4; i++)
+	{
+		if (mDetailScales[i] > detail)
+		{
+			return i-1;
+		}
+	}
+
+	return 3;
+}
+
 F32 LLVolumeLODGroup::dump()
 {
 	F32 usage = 0.f;
diff --git a/indra/llmath/llvolumemgr.h b/indra/llmath/llvolumemgr.h
index a78ea76a1a8d05c67191b2b47e67cbe57452c133..f5dc4cd748dce183608c8debbd66f8eccef60092 100644
--- a/indra/llmath/llvolumemgr.h
+++ b/indra/llmath/llvolumemgr.h
@@ -59,6 +59,7 @@ class LLVolumeLODGroup
 	static S32 getDetailFromTan(const F32 tan_angle);
 	static void getDetailProximity(const F32 tan_angle, F32 &to_lower, F32& to_higher);
 	static F32 getVolumeScaleFromDetail(const S32 detail);
+	static S32 getVolumeDetailFromScale(F32 scale);
 
 	LLVolume* refLOD(const S32 detail);
 	BOOL derefLOD(LLVolume *volumep);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 4c126d8fd936823d03f8f6176f20f06a6df6d0ca..64c2e9e8ecc3e9450238da5362357d58967661ea 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -163,7 +163,6 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
 	mRelativeXformInvTrans.setIdentity();
 
 	mLOD = MIN_LOD;
-	mMeshSculptLevel = -2;
 	mTextureAnimp = NULL;
 	mVObjRadius = LLVector3(1,1,0.5f).length();
 	mNumFaces = 0;
@@ -682,25 +681,7 @@ void LLVOVolume::updateTextureVirtualSize()
 		LLUUID id =  sculpt_params->getSculptTexture();
 		U8 sculpt_type = sculpt_params->getSculptType();
 
-		if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
-			// mesh is a mesh
-		{
-			if (mMeshSculptLevel == -2)
-			{
-				// get the asset please
-				gPipeline.loadMesh(this, id);
-				/*gAssetStorage->getAssetData(id,	LLAssetType::AT_MESH, (LLGetAssetCallback)NULL, NULL, TRUE);
-
-				if (gAssetStorage->hasLocalAsset(id, LLAssetType::AT_MESH))
-				{
-					gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
-					mSculptChanged = TRUE;
-				}*/
-			}
-		}
-
-		else
-			// mesh is a sculptie
+		if ((sculpt_type & LL_SCULPT_TYPE_MASK) != LL_SCULPT_TYPE_MESH)
 		{
 			mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 
@@ -902,14 +883,10 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &params, const S32 detail, bool
 			if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
 			{
 				if (getVolume()->getNumVolumeFaces() == 0)
-				{
-					//mesh is not loaded, request pipeline load this mesh
+				{ 
+					//load request not yet issued, request pipeline load this mesh
 					LLUUID asset_id = volume_params.getSculptID();
-					gPipeline.loadMesh(this, asset_id, detail);
-				}
-				else
-				{
-					mMeshSculptLevel = 1;
+					gPipeline.loadMesh(this, asset_id, LLVolumeLODGroup::getVolumeDetailFromScale(getVolume()->getDetail()));
 				}
 			}
 			else // otherwise is sculptie
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 4b247f3778a28cd9ae2cac95efe71f76fae5f8f7..f14a71130b8ff85f56be5911f2190e5acb428f28 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -298,7 +298,6 @@ class LLVOVolume : public LLViewerObject
 	LLFrameTimer mTextureUpdateTimer;
 	S32			mLOD;
 	BOOL		mLODChanged;
-	S32         mMeshSculptLevel;
 	BOOL		mSculptChanged;
 	F32			mSpotLightPriority;
 	LLMatrix4	mRelativeXform;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 3410ad6559e5addd7f981a65b7d96faa7d227928..0ee619244b4dea5534f7cc096e06878e24ef41ed 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8913,23 +8913,29 @@ LLCullResult::sg_list_t::iterator LLPipeline::endAlphaGroups()
 
 void LLPipeline::loadMesh(LLVOVolume* vobj, LLUUID mesh_id, S32 detail)
 {
+
+	if (detail < 0 || detail > 4)
+	{
+		return;
+	}
+
 	{
 		LLMutexLock lock(mMeshMutex);
 		//add volume to list of loading meshes
-		mesh_load_map::iterator iter = mLoadingMeshes.find(mesh_id);
-		if (iter != mLoadingMeshes.end())
+		mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_id);
+		if (iter != mLoadingMeshes[detail].end())
 		{ //request pending for this mesh, append volume id to list
 			iter->second.insert(vobj->getID());
 			return;
 		}
 
 		//first request for this mesh
-		mLoadingMeshes[mesh_id].insert(vobj->getID());
+		mLoadingMeshes[detail][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, vobj->getVolume()));
+		mPendingMeshes.push_back(new LLMeshThread(mesh_id, vobj->getVolume(), detail));
 	}
 	else
 	{ //fetch asset and load when done
@@ -8952,7 +8958,7 @@ void LLPipeline::loadMesh(LLVOVolume* vobj, LLUUID mesh_id, S32 detail)
 			for (S32 i = detail-1; i >= 0; --i)
 			{
 				LLVolume* lod = group->refLOD(i);
-				if (lod && lod->getNumVolumeFaces() > 0)
+				if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
 				{
 					volume->copyVolumeFaces(lod);
 					group->derefLOD(lod);
@@ -8966,7 +8972,7 @@ void LLPipeline::loadMesh(LLVOVolume* vobj, LLUUID mesh_id, S32 detail)
 			for (S32 i = detail+1; i < 4; ++i)
 			{
 				LLVolume* lod = group->refLOD(i);
-				if (lod && lod->getNumVolumeFaces() > 0)
+				if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
 				{
 					volume->copyVolumeFaces(lod);
 					group->derefLOD(lod);
@@ -8976,6 +8982,10 @@ void LLPipeline::loadMesh(LLVOVolume* vobj, LLUUID mesh_id, S32 detail)
 				group->derefLOD(lod);
 			}
 		}
+		else
+		{
+			llerrs << "WTF?" << llendl;
+		}
 
 		//nothing found, so make a tetrahedron
 		volume->makeTetrahedron();
@@ -8992,12 +9002,22 @@ void LLPipeline::getMeshAssetCallback(LLVFS *vfs,
 }
 
 
-LLPipeline::LLMeshThread::LLMeshThread(LLUUID mesh_id, LLVolume* target)
+LLPipeline::LLMeshThread::LLMeshThread(LLUUID mesh_id, LLVolume* target, S32 detail)
 : LLThread("mesh_loading_thread")
 {
 	mMeshID = mesh_id;
 	mVolume = NULL;
 	mDetail = target->getDetail();
+
+	if (detail == -1)
+	{
+		mDetailIndex = LLVolumeLODGroup::getVolumeDetailFromScale(target->getDetail());
+	}
+	else
+	{
+		mDetailIndex = detail;
+	}
+
 	mTargetVolume = target;
 }
 
@@ -9073,6 +9093,10 @@ void LLPipeline::notifyLoadedMeshes()
 
 	for (std::list<LLMeshThread*>::iterator iter = mLoadedMeshes.begin(); iter != mLoadedMeshes.end(); ++iter)
 	{ //for each mesh done loading
+
+
+
+
 		LLMeshThread* mesh = *iter;
 		
 		if (!mesh->isStopped())
@@ -9081,10 +9105,12 @@ void LLPipeline::notifyLoadedMeshes()
 			continue;
 		}
 
+		S32 detail = mesh->mDetailIndex;
+
 		//get list of objects waiting to be notified this mesh is loaded
-		mesh_load_map::iterator obj_iter = mLoadingMeshes.find(mesh->mMeshID);
+		mesh_load_map::iterator obj_iter = mLoadingMeshes[detail].find(mesh->mMeshID);
 
-		if (mesh->mVolume && obj_iter != mLoadingMeshes.end())
+		if (mesh->mVolume && obj_iter != mLoadingMeshes[detail].end())
 		{
 			//make sure target volume is still valid
 			BOOL valid = FALSE;
@@ -9109,6 +9135,10 @@ void LLPipeline::notifyLoadedMeshes()
 				{
 					mesh->mTargetVolume->copyVolumeFaces(mesh->mVolume);
 				}
+				else
+				{
+					llwarns << "Mesh loading returned empty volume." << llendl;
+				}
 
 				for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
 				{
@@ -9120,7 +9150,7 @@ void LLPipeline::notifyLoadedMeshes()
 				}
 			}
 
-			mLoadingMeshes.erase(mesh->mMeshID);
+			mLoadingMeshes[detail].erase(mesh->mMeshID);
 		}
 
 		delete mesh;
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 23e98aa0d6f85370bfe675ba48152ec6ee2cf2ba..a31379a209279c501e816b24c72b414f831a3df5 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -676,8 +676,9 @@ class LLPipeline
 protected:
 	std::vector<LLFace*>		mSelectedFaces;
 
+
 	typedef std::map<LLUUID, std::set<LLUUID> > mesh_load_map;
-	mesh_load_map mLoadingMeshes;
+	mesh_load_map mLoadingMeshes[4];
 	
 	LLMutex*					mMeshMutex;
 
@@ -688,7 +689,8 @@ class LLPipeline
 		LLVolume* mTargetVolume;
 		LLUUID mMeshID;
 		F32 mDetail;
-		LLMeshThread(LLUUID mesh_id, LLVolume* target);
+		S32 mDetailIndex;
+		LLMeshThread(LLUUID mesh_id, LLVolume* target, S32 detail = -1);
 		~LLMeshThread();
 		void run();
 	};