diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index d8e4d4a1737224bed20955a480a7a7414c23d6bb..d13e6b662c3286191d58e451072a127f1c78478d 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -1903,14 +1903,70 @@ bool LLModel::loadModel(std::istream& is)
 
 }
 
-void LLModel::matchMaterialOrder(LLModel* ref)
+bool LLModel::isMaterialListSubset( LLModel* ref )
 {
-	llassert(ref->mMaterialList.size() == mMaterialList.size());
+	int refCnt = ref->mMaterialList.size();
+	int modelCnt = mMaterialList.size();
+	
+	for (U32 src = 0; src < modelCnt; ++src)
+	{				
+		bool foundRef = false;
+		
+		for (U32 dst = 0; dst < refCnt; ++dst)
+		{
+			//llinfos<<mMaterialList[src]<<" "<<ref->mMaterialList[dst]<<llendl;
+			foundRef = mMaterialList[src] == ref->mMaterialList[dst];									
+				
+			if ( foundRef )
+			{	
+				break;
+			}										
+		}
+		if (!foundRef)
+		{
+			return false;
+		}
+	}
+	
+	return true;
+}
+
+bool LLModel::needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
+{
+	bool changed = false;
+	if ( refFaceCnt< modelFaceCnt )
+	{
+		refFaceCnt += modelFaceCnt - refFaceCnt;
+		changed = true;
+	}
+	else 
+	if ( modelFaceCnt < refFaceCnt )
+	{
+		modelFaceCnt += refFaceCnt - modelFaceCnt;
+		changed = true;
+	}
+	
+	return changed;
+}
 
+bool LLModel::matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
+{
+	//Is this a subset?
+	//LODs cannot currently add new materials, e.g.
+	//1. ref = a,b,c lod1 = d,e => This is not permitted
+	//2. ref = a,b,c lod1 = c => This would be permitted
+	
+	bool isASubset = isMaterialListSubset( ref );
+	if ( !isASubset )
+	{
+		return false;
+	}
+	
 	std::map<std::string, U32> index_map;
 	
 	//build a map of material slot names to face indexes
 	bool reorder = false;
+
 	std::set<std::string> base_mat;
 	std::set<std::string> cur_mat;
 
@@ -1952,6 +2008,7 @@ void LLModel::matchMaterialOrder(LLModel* ref)
 
 	//override material list with reference model ordering
 	mMaterialList = ref->mMaterialList;
+	return true;
 }
 
 
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index 9a7b9fa2710ad04a89fb2c95103c71ff32224650..1cf528fd9f3a723b8bf5b8035a8471b5a5f25872 100644
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -176,8 +176,10 @@ class LLModel : public LLVolume
 	
 	//reorder face list based on mMaterialList in this and reference so 
 	//order matches that of reference (material ordering touchup)
-	void matchMaterialOrder(LLModel* reference);
-
+	bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
+	bool isMaterialListSubset( LLModel* ref );
+	bool needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
+	
 	std::vector<std::string> mMaterialList;
 
 	//data used for skin weights
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index b1b5e69968956f9294cc38ad95e2e967326b677d..80db002f0e6a9105c57020cbe583c7de6ef355c9 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -3186,8 +3186,14 @@ void LLModelPreview::rebuildUploadData()
 		{
 			for (U32 j = 0; j < mBaseModel.size(); ++j)
 			{
-				mModel[i][j]->matchMaterialOrder(mBaseModel[j]);
-				llassert(mModel[i][j]->mMaterialList == mBaseModel[j]->mMaterialList);
+				
+				int refFaceCnt = 0;
+				int modelFaceCnt = 0;
+				
+				if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )
+				{
+					mFMP->childDisable( "calculate_btn" );
+				}
 			}
 		}
 	}
@@ -4765,6 +4771,42 @@ void LLModelPreview::createPreviewAvatar( void )
 	}
 }
 
+void LLModelPreview::addEmptyFace( LLModel* pTarget )
+{
+	U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+	
+	LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0);
+	
+	buff->allocateBuffer(1, 3, true);
+	memset( buff->getMappedData(), 0, buff->getSize() );
+	memset( buff->getIndicesPointer(), 0, buff->getIndicesSize() );
+		
+	buff->validateRange( 0, buff->getNumVerts()-1, buff->getNumIndices(), 0 );
+		
+	LLStrider<LLVector3> pos;
+	LLStrider<LLVector3> norm;
+	LLStrider<LLVector2> tc;
+	LLStrider<U16> index;
+		
+	buff->getVertexStrider(pos);
+		
+	if ( type_mask & LLVertexBuffer::MAP_NORMAL )
+	{
+		buff->getNormalStrider(norm);
+	}
+	if ( type_mask & LLVertexBuffer::MAP_TEXCOORD0 )
+	{
+		buff->getTexCoord0Strider(tc);
+	}
+		
+	buff->getIndexStrider(index);
+		
+	//resize face array
+	int faceCnt = pTarget->getNumVolumeFaces();
+	pTarget->setNumVolumeFaces( faceCnt+1 );	
+	pTarget->setVolumeFaceData( faceCnt+1, pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices() );
+	
+}	
 //-----------------------------------------------------------------------------
 // render()
 //-----------------------------------------------------------------------------
@@ -4976,8 +5018,13 @@ BOOL LLModelPreview::render()
 			{
 				for (U32 j = 0; j < mBaseModel.size(); ++j)
 				{
-					mModel[i][j]->matchMaterialOrder(mBaseModel[j]);
-					llassert(mModel[i][j]->mMaterialList == mBaseModel[j]->mMaterialList);
+					int refFaceCnt = 0;
+					int modelFaceCnt = 0;
+										
+					if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )
+					{
+						mFMP->childDisable( "calculate_btn" );
+					}
 				}
 			}
 		}
@@ -5019,8 +5066,6 @@ BOOL LLModelPreview::render()
 							const std::string& binding = instance.mModel->mMaterialList[i];						
 							const LLImportMaterial& material = instance.mMaterial[binding];
 
-							llassert(binding == model->mMaterialList[i]);
-						
 							glColor4fv(material.mDiffuseColor.mV);
 							if (material.mDiffuseMap.notNull())
 							{
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index f383b3fe989bea7d35aad492848df8ae4288a6b8..723e8c48b878ed367c2c570ceb600c0fe83c0ab5 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -336,7 +336,8 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	void updateStatusMessages();
 	void clearGLODGroup();
 	void onLODParamCommit(bool enforce_tri_limit);
-
+	void addEmptyFace( LLModel* pTarget );
+	
 	const bool getModelPivot( void ) const { return mHasPivot; }
 	void setHasPivot( bool val ) { mHasPivot = val; }
 	void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; }