diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index c1b74b1fd7ee5cd96a5b2de9f07218b4dd2dcb62..d884c30d61e68c9a7b43d33383c62a6f033a9807 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -821,7 +821,8 @@ LLDAELoader::LLDAELoader(
 		opaque_userdata,
 		jointMap,
 		jointsFromNodes),
-mGeneratedModelLimit(modelLimit)
+mGeneratedModelLimit(modelLimit),
+mForceIdNaming(false)
 {
 }
 
@@ -944,6 +945,32 @@ bool LLDAELoader::OpenFile(const std::string& filename)
 
 	mTransform.condition();	
 
+	mForceIdNaming = false;
+	std::vector<std::string> checkNames;
+	for (daeInt idx = 0; idx < count; ++idx)
+	{
+		domMesh* mesh = NULL;
+		db->getElement((daeElement**)&mesh, idx, NULL, COLLADA_TYPE_MESH);
+
+		if (mesh)
+		{
+			std::string name = getLodlessLabel(mesh, false);
+
+			std::vector<std::string>::iterator it;
+			it = std::find(checkNames.begin(), checkNames.end(), name);
+			if (it != checkNames.end())
+			{
+				LL_WARNS() << "document has duplicate names, using IDs instead" << LL_ENDL;
+				mForceIdNaming = true;
+				break;
+			}
+			else
+			{
+				checkNames.push_back(name);
+			}
+		}
+	}
+	
 	U32 submodel_limit = count > 0 ? mGeneratedModelLimit/count : 0;
 	for (daeInt idx = 0; idx < count; ++idx)
 	{ //build map of domEntities to LLModel
@@ -1944,7 +1971,7 @@ void LLDAELoader::processElement( daeElement* element, bool& badElement, DAE* da
 					
 					if (model->mLabel.empty())
 					{
-						label = getLodlessLabel(instance_geo);
+						label = getLodlessLabel(instance_geo, mForceIdNaming);
 
 						llassert(!label.empty());
 
@@ -2159,12 +2186,17 @@ LLImportMaterial LLDAELoader::profileToMaterial(domProfile_COMMON* material, DAE
 	return mat;
 }
 
-// try to get a decent label for this element
 std::string LLDAELoader::getElementLabel(daeElement *element)
+{
+	return getElementLabel(element, mForceIdNaming);
+}
+
+// try to get a decent label for this element
+std::string LLDAELoader::getElementLabel(daeElement *element, bool forceIdNaming)
 {
 	// if we have a name attribute, use it
 	std::string name = element->getAttribute("name");
-	if (name.length())
+	if (name.length() && !forceIdNaming)
 	{
 		return name;
 	}
@@ -2187,7 +2219,7 @@ std::string LLDAELoader::getElementLabel(daeElement *element)
 
 		// if parent has a name or ID, use it
 		std::string name = parent->getAttribute("name");
-		if (!name.length())
+		if (!name.length() || forceIdNaming)
 		{
 			name = std::string(parent->getID());
 		}
@@ -2230,9 +2262,9 @@ size_t LLDAELoader::getSuffixPosition(std::string label)
 }
 
 // static
-std::string LLDAELoader::getLodlessLabel(daeElement *element)
+std::string LLDAELoader::getLodlessLabel(daeElement *element, bool forceIdNaming)
 {
-	std::string label = getElementLabel(element);
+	std::string label = getElementLabel(element, forceIdNaming);
 	size_t ext_pos = getSuffixPosition(label);
 	if (ext_pos != -1)
 	{
@@ -2303,8 +2335,13 @@ bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh)
 	return (status == LLModel::NO_ERRORS);
 }
 
-//static 
 LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh)
+{
+	return loadModelFromDomMesh(mesh, mForceIdNaming);
+}
+
+//static 
+LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh, bool forceIdNaming)
 {
 	LLVolumeParams volume_params;
 	volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
@@ -2312,7 +2349,7 @@ LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh)
 	createVolumeFacesFromDomMesh(ret, mesh);
     if (ret->mLabel.empty())
     {
-	    ret->mLabel = getElementLabel(mesh);
+		ret->mLabel = getElementLabel(mesh, forceIdNaming);
     }
     return ret;
 }
@@ -2330,7 +2367,7 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo
 
 	LLModel* ret = new LLModel(volume_params, 0.f);
 
-	std::string model_name = getLodlessLabel(mesh);
+	std::string model_name = getLodlessLabel(mesh, mForceIdNaming);
 	ret->mLabel = model_name + lod_suffix[mLod];
 
 	llassert(!ret->mLabel.empty());
diff --git a/indra/llprimitive/lldaeloader.h b/indra/llprimitive/lldaeloader.h
index 7d91a6063b4cad0e4a2ed78443ce288012f3ee3d..3ababd3156153ecebd06a305e624e8cf34b2d254 100644
--- a/indra/llprimitive/lldaeloader.h
+++ b/indra/llprimitive/lldaeloader.h
@@ -89,19 +89,22 @@ class LLDAELoader : public LLModelLoader
 	static bool addVolumeFacesFromDomMesh(LLModel* model, domMesh* mesh);
 	static bool createVolumeFacesFromDomMesh(LLModel* model, domMesh *mesh);
 
-	static LLModel* loadModelFromDomMesh(domMesh* mesh);
+	static LLModel* loadModelFromDomMesh(domMesh* mesh, bool forceIdNaming);
+	LLModel* loadModelFromDomMesh(domMesh* mesh);
 
 	// Loads a mesh breaking it into one or more models as necessary
 	// to get around volume face limitations while retaining >8 materials
 	//
 	bool loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& models_out, U32 submodel_limit);
 
-	static std::string getElementLabel(daeElement *element);
+	static std::string getElementLabel(daeElement *element, bool forceIdNaming);
+	std::string getElementLabel(daeElement *element);
 	static size_t getSuffixPosition(std::string label);
-	static std::string getLodlessLabel(daeElement *element);
+	static std::string getLodlessLabel(daeElement *element, bool forceIdNaming = false);
 
 private:
 	U32 mGeneratedModelLimit; // Attempt to limit amount of generated submodels
+	bool mForceIdNaming;
 
 };
 #endif  // LL_LLDAELLOADER_H