diff --git a/autobuild.xml b/autobuild.xml
index 06a70ea5ed7ec3cf33c33182f4c0d054091a6faf..7cf6e23386ba3a032bf12526353bd792d6adfb1c 100755
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1291,9 +1291,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>df8857aeb5f44dfd95f9f9f57814423a</string>
+              <string>ddd6a49dd5bbb76216f73feafa26e65c</string>
               <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llappearanceutility-source/rev/275707/arch/Linux/installer/llappearanceutility_source-0.1-linux-20130511.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llappearanceutility-source/rev/276989/arch/Linux/installer/llappearanceutility_source-0.1-linux-20130605.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index ae4961559ec8a6165409e688e46d73688608391f..93eca8b62ee5b42096133512f82d45e1d58c3978 100755
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -704,9 +704,9 @@ void LLFloater::openFloater(const LLSD& key)
 	dirtyRect();
 }
 
-void LLFloater::verifyClose()
+void LLFloater::verifyClose( bool app_quitting )
 {
-	LLPanel::handleCloseConfirmation();
+	LLPanel::handleCloseConfirmation( app_quitting );
 }
 
 void LLFloater::closeFloater(bool app_quitting)
@@ -717,16 +717,21 @@ void LLFloater::closeFloater(bool app_quitting)
 	{
 		if ( mVerifyUponClose && !mForceCloseAfterVerify )
 		{
+
+			llinfos<<"prep#dogshit1"<<llendl;
 			onClose( app_quitting );
 			if ( mForceCloseAfterVerify ) 
 			{			
+
+				llinfos<<"prep#dogshit1b"<<llendl;
 				return;
 			}			
 		}
 	}	
 
 	if (app_quitting)
-	{
+	{	
+		llinfos<<"prep#dogshit2"<<llendl;
 		LLFloater::sQuitting = true;
 	}
 	
@@ -2659,7 +2664,7 @@ void LLFloaterView::closeAllChildren(bool app_quitting)
 		{
 			if ( floaterp->mVerifyUponClose )
 			{			
-				floaterp->verifyClose();
+				floaterp->verifyClose(app_quitting);
 			}
 			else
 			{
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index bf71b527b326d926f7ce4e2617080566c4f5461a..8eb40ddd0bb578c07975301f7ad3cc17c93078c7 100755
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -225,7 +225,7 @@ class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>
 
 	// If allowed, close the floater cleanly, releasing focus.
 	virtual void	closeFloater(bool app_quitting = false);
-	virtual void	verifyClose();
+	virtual void	verifyClose( bool app_quitting = false );
 
 	// Close the floater or its host. Use when hidding or toggling a floater instance.
 	virtual void	closeHostedFloater();
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 7b7920f866ca975bc801b6d5eb13374a39b21c8b..b0bdbcb7d1db5ea9f39f1bf5b408168cb105a674 100755
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -354,11 +354,11 @@ void LLPanel::handleVisibilityChange ( BOOL new_visibility )
 }
 
 
-void LLPanel::handleCloseConfirmation( )
+void LLPanel::handleCloseConfirmation( bool app_quitting)
 {	
 	if (mCloseConfirmationSignal)
 	{
-		(*mCloseConfirmationSignal)(this, LLSD() ); 
+		(*mCloseConfirmationSignal)(this, LLSD( app_quitting ) ); 
 	}
 }
 void LLPanel::setFocus(BOOL b)
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index d48fab6dd9248cc2666d666a7fa84e3aaf32f564..02f8c0aba781cf80cb7c72bbac3e636380cd915d 100755
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -116,7 +116,7 @@ class LLPanel : public LLUICtrl, public LLBadgeHolder
 	/*virtual*/ void	draw();	
 	/*virtual*/ BOOL	handleKeyHere( KEY key, MASK mask );
 	/*virtual*/ void 	handleVisibilityChange ( BOOL new_visibility );
-				void	handleCloseConfirmation( );
+				void	handleCloseConfirmation( bool app_quitting );
 
 
 	// From LLFocusableElement
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 646b2d18dd699e5a1f2afc7b5a0acc9c98454a88..722587ec0eba11a760fe68593d274e442b47d5cf 100755
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -3276,6 +3276,15 @@ void LLAppearanceMgr::incrementCofVersion(LLHTTPClient::ResponderPtr responder_p
 	LLHTTPClient::get(url, body, responder_ptr, headers, 30.0f);
 }
 
+U32 LLAppearanceMgr::getNumAttachmentsInCOF()
+{
+	const LLUUID cof = getCOF();
+	LLInventoryModel::item_array_t obj_items;
+	getDescendentsOfAssetType(cof, obj_items, LLAssetType::AT_OBJECT);
+	return obj_items.size();
+}
+
+
 std::string LLAppearanceMgr::getAppearanceServiceURL() const
 {
 	if (gSavedSettings.getString("DebugAvatarAppearanceServiceURLOverride").empty())
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 97f328381877c861c3f226ce31f007e473bb98de..9eb26767c4711553ff1ff9db08d9eb9d20192e89 100755
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -208,6 +208,8 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
 
 	void incrementCofVersion(LLHTTPClient::ResponderPtr responder_ptr = NULL);
 
+	U32 getNumAttachmentsInCOF();
+
 	// *HACK Remove this after server side texture baking is deployed on all sims.
 	void incrementCofVersionLegacy();
 
diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp
index 13a9ba1695449889a909e77d26851a760411af00..02216420da22ba77c33f3056ac1401d375177a6f 100755
--- a/indra/newview/llfloatersidepanelcontainer.cpp
+++ b/indra/newview/llfloatersidepanelcontainer.cpp
@@ -40,7 +40,8 @@
 const std::string LLFloaterSidePanelContainer::sMainPanelName("main_panel");
 
 LLFloaterSidePanelContainer::LLFloaterSidePanelContainer(const LLSD& key, const Params& params)
-:	LLFloater(key, params)
+: LLFloater(key, params)
+, mAppQuiting( false )
 {
 	// Prevent transient floaters (e.g. IM windows) from hiding
 	// when this floater is clicked.
@@ -56,7 +57,8 @@ BOOL LLFloaterSidePanelContainer::postBuild()
 }
 
 void  LLFloaterSidePanelContainer::onConfirmationClose( const LLSD &confirm )
-{	
+{
+	mAppQuiting = confirm.asBoolean();
 	onClickCloseBtn();
 }
 
@@ -69,10 +71,12 @@ LLFloaterSidePanelContainer::~LLFloaterSidePanelContainer()
 void LLFloaterSidePanelContainer::onOpen(const LLSD& key)
 {
 	getChild<LLPanel>(sMainPanelName)->onOpen(key);
+	mAppQuiting = false;
 }
-void LLFloaterSidePanelContainer::onClose(bool app_quitting)
-{		
-	mForceCloseAfterVerify = true;  		
+
+void LLFloaterSidePanelContainer::onClose( bool app_quitting )
+{
+	if (! mAppQuiting ) { mForceCloseAfterVerify = true; }
 	LLSidepanelAppearance* panel = getSidePanelAppearance();
 	if ( panel )
 	{		
@@ -80,6 +84,7 @@ void LLFloaterSidePanelContainer::onClose(bool app_quitting)
 		panel->onCloseFromAppearance( this );			
 	}
 }
+
 void LLFloaterSidePanelContainer::onClickCloseBtn()
 {
 	LLSidepanelAppearance* panel = getSidePanelAppearance();
diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h
index dc85570f7e589bee6276b5e24ec3b8b1d212c265..b276821805b7f543346f57eb4bbedac7aef4de27 100755
--- a/indra/newview/llfloatersidepanelcontainer.h
+++ b/indra/newview/llfloatersidepanelcontainer.h
@@ -89,6 +89,9 @@ class LLFloaterSidePanelContainer : public LLFloater
 
 private:
 	LLSidepanelAppearance* getSidePanelAppearance();
+
+public: 
+	bool mAppQuiting;
 };
 
 #endif // LL_LLFLOATERSIDEPANELCONTAINER_H
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 70da576c83eab87c7e30d2d7b0b06c5c2df7c63a..775c148ea1401cf16e7ab06c212fc08794967f9d 100755
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -151,11 +151,17 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notifica
 		toggleWearableEditPanel(FALSE);	
 		showOutfitEditPanel();
 		LLVOAvatarSelf::onCustomizeEnd( FALSE );	
-		mRevertSet = true;
+		if ( !mLLFloaterSidePanelContainer->mAppQuiting ) 
+		{
+			mRevertSet = true; 			
+		}
+		else
+		{
+			mLLFloaterSidePanelContainer->closeFloater( true );
+		}
 		return false;
 	}
 	mLLFloaterSidePanelContainer->mForceCloseAfterVerify = false;
-	//mRevertSet = true;
 	return false;
 }
 
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 064e96e3942905e6ca72a51440438565ad4c8587..63de1ab77a127bd2c35bcda44a975aa16d8ac5a4 100755
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -5038,6 +5038,28 @@ void LLViewerObject::clearDrawableState(U32 state, BOOL recursive)
 	}
 }
 
+BOOL LLViewerObject::isDrawableState(U32 state, BOOL recursive) const
+{
+	BOOL matches = FALSE;
+	if (mDrawable)
+	{
+		matches = mDrawable->isState(state);
+	}
+	if (recursive)
+	{
+		for (child_list_t::const_iterator iter = mChildList.begin();
+			 (iter != mChildList.end()) && matches; iter++)
+		{
+			LLViewerObject* child = *iter;
+			matches &= child->isDrawableState(state, recursive);
+		}
+	}
+
+	return matches;
+}
+
+
+
 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 // RN: these functions assume a 2-level hierarchy 
 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 316dbce7d07eca427072af14d06ef39f67c52e55..0390cbc5b00e42c29c4aaff3032c3341265d527a 100755
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -394,6 +394,7 @@ class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
 
 	void setDrawableState(U32 state, BOOL recursive = TRUE);
 	void clearDrawableState(U32 state, BOOL recursive = TRUE);
+	BOOL isDrawableState(U32 state, BOOL recursive = TRUE) const;
 
 	// Called when the drawable shifts
 	virtual void onShift(const LLVector4a &shift_vector)	{ }
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 1dbcabf2b3706156b774fc69b458c3a2e0c64757..4593541f357305fe2f41a09460431831ba6ac971 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -5220,24 +5220,60 @@ void LLVOAvatar::computeBodySize()
 	LLAvatarAppearance::computeBodySize();
 
 	// Certain configurations of avatars can force the overall height (with offset) to go negative.
-	// Enforce a constraint to make sure we don't go below 0.1 meters.
+	// Enforce a constraint to make sure we don't go below 1.1 meters (server-enforced limit)
 	// Camera positioning and other things start to break down when your avatar is "walking" while being fully underground
+	const LLViewerObject * last_object = NULL;
 	if (isSelf() && getWearableData() && isFullyLoaded() && !LLApp::isQuitting())
 	{
-		LLViewerWearable* shape = (LLViewerWearable*)getWearableData()->getWearable(LLWearableType::WT_SHAPE, 0);
-		if (shape && !shape->getVolitile()) 
+		// Do not force a hover parameter change while we have pending attachments, which may be mesh-based with 
+		// joint offsets.
+		if (LLAppearanceMgr::instance().getNumAttachmentsInCOF() == getNumAttachments())
 		{
-			F32 hover_value = shape->getVisualParamWeight(AVATAR_HOVER);
-			if (hover_value < 0.0f && (mBodySize.mV[VZ] + hover_value < 1.1f))
+			LLViewerWearable* shape = (LLViewerWearable*)getWearableData()->getWearable(LLWearableType::WT_SHAPE, 0);
+			BOOL loaded = TRUE;
+			for (attachment_map_t::const_iterator points_iter = mAttachmentPoints.begin();
+				 points_iter != mAttachmentPoints.end() && loaded;
+				 ++points_iter)
 			{
-				hover_value = -(mBodySize.mV[VZ] - 1.1f); // avoid floating point rounding making the above check continue to fail.
-				llassert(mBodySize.mV[VZ] + hover_value >= 1.1f);
+				const LLViewerJointAttachment *attachment_pt = (*points_iter).second;
+				if (attachment_pt) 
+				{
+					for (LLViewerJointAttachment::attachedobjs_vec_t::const_iterator attach_iter = attachment_pt->mAttachedObjects.begin(); attach_iter != attachment_pt->mAttachedObjects.end(); attach_iter++) 
+					{
+						const LLViewerObject* object = (LLViewerObject*)*attach_iter;
+						if (object) 
+						{
+							last_object = object;
+							llwarns << "attachment at point: " << (*points_iter).first << " object exists: " << object->getAttachmentItemID() << llendl;
+							loaded &=!object->isDrawableState(LLDrawable::REBUILD_ALL);
+							if (!loaded && shape && !shape->getVolitile()) 
+							{
+								llwarns << "caught unloaded attachment! skipping enforcement" << llendl;
+							}
+						}
+					}
+				}
+			}
 
-				hover_value =  llmin(hover_value, 0.0f); // don't force the hover value to be greater than 0.
+			if (last_object) 
+			{
+				LL_DEBUGS("Avatar") << "scanned at least one object!"  << LL_ENDL;
+			}
+			if (loaded && shape && !shape->getVolitile()) 
+			{
+				F32 hover_value = shape->getVisualParamWeight(AVATAR_HOVER);
+				if (hover_value < 0.0f && (mBodySize.mV[VZ] + hover_value < 1.1f))
+				{
+					hover_value = -(mBodySize.mV[VZ] - 1.1f); // avoid floating point rounding making the above check continue to fail.
+					llassert(mBodySize.mV[VZ] + hover_value >= 1.1f);
+
+					hover_value =  llmin(hover_value, 0.0f); // don't force the hover value to be greater than 0.
 
-				mAvatarOffset.mV[VZ] = hover_value;
-				shape->setVisualParamWeight(AVATAR_HOVER,hover_value, FALSE);
+					LL_DEBUGS("Avatar") << "changed hover value to: " << hover_value << " from: " << mAvatarOffset.mV[VZ] << LL_ENDL;
 
+					mAvatarOffset.mV[VZ] = hover_value;
+					shape->setVisualParamWeight(AVATAR_HOVER,hover_value, FALSE);
+				}
 			}
 		}
 	}