diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 5af1122451fe1da818510d5c69c25d8fe145b86b..794cdb83d592d82531ea6a4babc48cb3d0192b5d 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -232,27 +232,16 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
 	domPRef p = tri->getP();
 	domListOfUInts& idx = p->getValue();
 	
-	domListOfFloats v;
-	domListOfFloats tc;
-	domListOfFloats n;
+	domListOfFloats  dummy ;
+	domListOfFloats& v = pos_source ? pos_source->getFloat_array()->getValue() : dummy ;
+	domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;
+	domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ;
 
 	if (pos_source)
 	{
-		v = pos_source->getFloat_array()->getValue();
 		face.mExtents[0].set(v[0], v[1], v[2]);
 		face.mExtents[1].set(v[0], v[1], v[2]);
 	}
-
-	if (tc_source)
-	{
-		tc = tc_source->getFloat_array()->getValue();
-	}
-
-	if (norm_source)
-	{
-		n = norm_source->getFloat_array()->getValue();
-	}
-
 	
 	LLVolumeFace::VertexMapData::PointMap point_map;
 	
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index c66b2255eb9081fd49f7f79a179a77daf3c7d26b..ae0e1b7d4698812a323fd340c4b76594c5e1e371 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -104,6 +104,7 @@
 //static
 S32 LLFloaterModelPreview::sUploadAmount = 10;
 LLFloaterModelPreview* LLFloaterModelPreview::sInstance = NULL;
+std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList;
 
 const S32 PREVIEW_BORDER_WIDTH = 2;
 const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
@@ -1087,6 +1088,15 @@ LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* pre
 	{
 		mTrySLM = false;
 	}
+
+	assert_main_thread();
+	sActiveLoaderList.push_back(this) ;
+}
+
+LLModelLoader::~LLModelLoader()
+{
+	assert_main_thread();
+	sActiveLoaderList.remove(this);
 }
 
 void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform)
@@ -1872,8 +1882,24 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)
 	return true;
 }
 
+//static
+bool LLModelLoader::isAlive(LLModelLoader* loader)
+{
+	if(!loader)
+	{
+		return false ;
+	}
+
+	std::list<LLModelLoader*>::iterator iter = sActiveLoaderList.begin() ;
+	for(; iter != sActiveLoaderList.end() && (*iter) != loader; ++iter) ;
+	
+	return *iter == loader ;
+}
+
 void LLModelLoader::loadModelCallback()
 {
+	assert_main_thread();
+
 	if (mPreview)
 	{
 		mPreview->loadModelCallback(mLod);	
@@ -1884,6 +1910,12 @@ void LLModelLoader::loadModelCallback()
 		apr_sleep(100);
 	}
 
+	//doubel check if "this" is valid before deleting it, in case it is aborted during running.
+	if(!isAlive(this))
+	{
+		return ;
+	}
+
 	//cleanup model loader
 	if (mPreview)
 	{
@@ -2693,7 +2725,7 @@ LLModelPreview::~LLModelPreview()
 	if (mModelLoader)
 	{
 		delete mModelLoader;
-		mModelLoader->mPreview = NULL;
+		mModelLoader = NULL;
 	}
 	//*HACK : *TODO : turn this back on when we understand why this crashes
 	//glodShutdown();
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 186bf114d1b26f6cdcc5d91d87753e8c7defeca9..7927edcd360829e18dda89a86b28db73cb3308aa 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -80,7 +80,7 @@ class LLModelLoader : public LLThread
 	BOOL mFirstTransform;
 	LLVector3 mExtents[2];
 	bool mTrySLM;
-
+	
 	std::map<daeElement*, LLPointer<LLModel> > mModel;
 	
 	typedef std::vector<LLPointer<LLModel> > model_list;
@@ -99,6 +99,8 @@ class LLModelLoader : public LLThread
 
 	LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap, 
 				   std::deque<std::string>& jointsFromNodes );
+	~LLModelLoader() ;
+
 	virtual void run();
 	bool doLoadModel();
 	bool loadFromSLM(const std::string& filename);
@@ -131,6 +133,10 @@ class LLModelLoader : public LLThread
 	std::map<std::string, std::string> mJointMap;
 	JointTransformMap& mJointList;	
 	std::deque<std::string>& mJointsFromNode;
+
+private:
+	static std::list<LLModelLoader*> sActiveLoaderList;
+	static bool isAlive(LLModelLoader* loader) ;
 };
 
 class LLFloaterModelPreview : public LLFloater
@@ -331,8 +337,8 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	
 	void setLoadState( U32 state ) { mLoadState = state; }
 	U32 getLoadState() { return mLoadState; }
-		
-	void setResetJointFlag( bool state ) { mResetJoints = state; }
+	//setRestJointFlag: If an asset comes through that changes the joints, we want the reset to persist
+	void setResetJointFlag( bool state ) { if ( !mResetJoints ) mResetJoints = state; }
 	bool getResetJointFlag( void ) { return mResetJoints; }
 
 	LLVector3 getTranslationForJointOffset( std::string joint );
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index e20e918a2a70f95bbb61dd5bea211e09296003bc..dd2ffdf7f188dee6f650955c3b18645e8b0546fd 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -454,6 +454,29 @@ class LLMeshPhysicsShapeResponder : public LLCurl::Responder
 
 };
 
+class LLModelObjectUploadResponder: public LLCurl::Responder
+{
+	LLSD mObjectAsset;
+	LLMeshUploadThread* mThread;
+
+public:
+	LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset):
+		mThread(thread),
+		mObjectAsset(object_asset)
+	{
+	}
+
+	virtual void completedRaw(U32 status, const std::string& reason,
+							  const LLChannelDescriptors& channels,
+							  const LLIOPipe::buffer_ptr_t& buffer)
+	{
+		assert_main_thread();
+		
+		llinfos << "completed" << llendl;
+		mThread->mPendingUploads--;
+		mThread->mFinished = true;
+	}
+};
 
 LLMeshRepoThread::LLMeshRepoThread()
 : LLThread("mesh repo", NULL) 
@@ -1467,10 +1490,13 @@ void LLMeshUploadThread::run()
 
 	if(!isDiscarded())
 	{
-		LLHTTPClient::post(url, object_asset, new LLHTTPClient::Responder());
+		mPendingUploads++;
+		LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset));
+	}
+	else
+	{
+		mFinished = true;
 	}
-
-	mFinished = true;
 }
 
 void LLMeshUploadThread::uploadModel(LLMeshUploadData& data)
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 979d96ca0de72147b920809c6c6a3894f278e4c9..ab031a9dc312067598edfcc6974e823d62148ca3 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -34,6 +34,7 @@
 #include "llmd5.h"
 #include "llsecondlifeurls.h"
 #include "v4color.h"
+#include "llversionviewer.h"
 
 #include "llappviewer.h"
 #include "llbutton.h"
@@ -861,12 +862,20 @@ void LLPanelLogin::loadLoginPage()
 								   LLVersionInfo::getShortVersion().c_str(),
 								   LLVersionInfo::getBuild());
 
-	char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
+	char* curl_channel ;
 	char* curl_version = curl_escape(version.c_str(), 0);
 
+	if(strcmp(LLVersionInfo::getChannel().c_str(), LL_CHANNEL))
+	{
+		curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
+	}
+	else //if LL_CHANNEL, direct it to "Second Life Beta Viewer".
+	{
+		curl_channel = curl_escape("Second Life Beta Viewer", 0);		
+	}
 	oStr << "&channel=" << curl_channel;
 	oStr << "&version=" << curl_version;
-
+	
 	curl_free(curl_channel);
 	curl_free(curl_version);