diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 3a7732c7b3afb805dfe680cdcefd37656d4e0c0f..6bf9fdfb9b8cf7249e0bbb474c7cbd9198895fe9 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -495,7 +495,8 @@ void LLFloaterModelPreview::onUploadSkinCommit(LLUICtrl*,void* userdata)
 	{
 		return;
 	}
-
+	
+	fp->mModelPreview->calcResourceCost();
 	fp->mModelPreview->refresh();
 	fp->mModelPreview->resetPreviewTarget();
 	fp->mModelPreview->clearBuffers();
@@ -1480,8 +1481,8 @@ void LLModelLoader::run()
 							//(which means we have all the joints that are required for an avatar versus
 							//a skinned asset attached to a node in a file that contains an entire skeleton,
 							//but does not use the skeleton).
-							
-							if ( !model->mJointList.empty() && doesJointArrayContainACompleteRig( model->mJointList ) ) 
+							mPreview->setRigValid( doesJointArrayContainACompleteRig( model->mJointList ) );
+							if ( !model->mJointList.empty() && mPreview->isRigValid() ) 
 							{
 								mResetJoints = true;
 							}
@@ -2233,6 +2234,7 @@ LLColor4 LLModelLoader::getDaeColor(daeElement* element)
 LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL)
 , mPelvisZOffset( 0.0f )
+, mRigValid( false )
 {
 	mNeedsUpdate = TRUE;
 	mCameraDistance = 0.f;
@@ -2293,6 +2295,16 @@ U32 LLModelPreview::calcResourceCost()
 		}
 	}
 
+	//Upload skin is selected BUT the joints coming in from the asset
+	//were malformed.
+	if ( mFMP && mFMP->childGetValue("upload_skin").asBoolean() )
+	{
+		if ( !isRigValid() )
+		{
+			mFMP->childDisable("ok_btn");
+		}
+	}
+	
 	U32 cost = 0;
 	std::set<LLModel*> accounted;
 	U32 num_points = 0;
@@ -2552,7 +2564,7 @@ void LLModelPreview::loadModel(std::string filename, S32 lod)
 	{
 		mFMP->childDisable("ok_btn");
 	}
-
+	
 	if (lod == mPreviewLOD)
 	{
 		mFMP->childSetText("lod_file", mLODFile[mPreviewLOD]);
@@ -3295,15 +3307,18 @@ void LLModelPreview::updateStatusMessages()
 
 	bool errorStateFromLoader = mModelLoader->getLoadState() == LLModelLoader::ERROR_PARSING ? true : false;
 
-	if ( upload_ok && !errorStateFromLoader )
+	bool skinAndRigOk = true;
+	bool uploadingSkin = mFMP->childGetValue("upload_skin").asBoolean();
+	if ( uploadingSkin && !isRigValid() )
 	{
-		mFMP->childEnable("ok_btn");
+		skinAndRigOk = false;
 	}
-	else
+
+	if ( upload_ok && !errorStateFromLoader && skinAndRigOk )
 	{
-		mFMP->childDisable("ok_btn");
+		mFMP->childEnable("ok_btn");
 	}
-
+	
 	//add up physics triangles etc
 	S32 start = 0;
 	S32 end = mModel[LLModel::LOD_PHYSICS].size();
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index e3b0f7522ece844577fd0eb2c6263d069df79634..b3053fe73a488353359a703436d3969db3ece8dd 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -294,6 +294,8 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	const bool getModelPivot( void ) const { return mHasPivot; }
 	void setHasPivot( bool val ) { mHasPivot = val; }
 	void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; }
+	const bool isRigValid( void ) const { return mRigValid; }
+	void setRigValid( bool rigValid ) { mRigValid = rigValid; }
 	
 	static void	textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
 	
@@ -361,6 +363,8 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	bool		mHasPivot;
 	
 	float		mPelvisZOffset;
+	
+	bool		mRigValid;
 };