diff --git a/indra/llcommon/llcallstack.cpp b/indra/llcommon/llcallstack.cpp
index 2409f7a87642eeae9b5f47e4e7159a397bafbe20..9978645ff41735c6f4d96dcc91a0b567b685a203 100644
--- a/indra/llcommon/llcallstack.cpp
+++ b/indra/llcommon/llcallstack.cpp
@@ -29,6 +29,7 @@
 #include "llcommon.h"
 #include "llcallstack.h"
 #include "StackWalker.h"
+#include "llthreadlocalstorage.h"
 
 #if LL_WINDOWS
 class LLCallStackImpl: public StackWalker
@@ -88,6 +89,19 @@ LLCallStack::LLCallStack(S32 skip_count, bool verbose):
     s_impl->getStack(m_strings, m_skipCount, m_verbose);
 }
 
+bool LLCallStack::contains(const std::string& str)
+{
+    for (std::vector<std::string>::const_iterator it = m_strings.begin();
+         it != m_strings.end(); ++it)
+    {
+        if (it->find(str) != std::string::npos)
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
 std::ostream& operator<<(std::ostream& s, const LLCallStack& call_stack)
 {
     std::vector<std::string>::const_iterator it;
@@ -98,8 +112,6 @@ std::ostream& operator<<(std::ostream& s, const LLCallStack& call_stack)
     return s;
 }
 
-#include "llthreadlocalstorage.h"
-
 LLContextStrings::LLContextStrings()
 {
 }
@@ -135,18 +147,40 @@ void LLContextStrings::removeContextString(const std::string& str)
     }
 }
 
+// static
+bool LLContextStrings::contains(const std::string& str)
+{
+    const std::map<std::string,S32>& strings =
+        LLThreadLocalSingletonPointer<LLContextStrings>::getInstance()->m_contextStrings;
+    for (std::map<std::string,S32>::const_iterator it = strings.begin(); it!=strings.end(); ++it)
+    {
+        if (it->first.find(str) != std::string::npos)
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
 // static
 void LLContextStrings::output(std::ostream& os)
 {
-    const std::map<std::string,S32>& strings = LLThreadLocalSingletonPointer<LLContextStrings>::getInstance()->m_contextStrings;
+    const std::map<std::string,S32>& strings =
+        LLThreadLocalSingletonPointer<LLContextStrings>::getInstance()->m_contextStrings;
     for (std::map<std::string,S32>::const_iterator it = strings.begin(); it!=strings.end(); ++it)
     {
         os << it->first << "[" << it->second << "]" << "\n";
     }
 }
 
+// static 
 std::ostream& operator<<(std::ostream& s, const LLContextStatus& context_status)
 {
     LLThreadLocalSingletonPointer<LLContextStrings>::getInstance()->output(s);
     return s;
 }
+
+bool LLContextStatus::contains(const std::string& str)
+{
+    return LLThreadLocalSingletonPointer<LLContextStrings>::getInstance()->contains(str);
+}
diff --git a/indra/llcommon/llcallstack.h b/indra/llcommon/llcallstack.h
index 719690798012375cf16d737ceb7e77fff6eb917e..1f7a7689d7671e0448cdc8ed6724263215ffe7d2 100644
--- a/indra/llcommon/llcallstack.h
+++ b/indra/llcommon/llcallstack.h
@@ -34,6 +34,7 @@ class LLCallStack
     LLCallStack(S32 skip_count=0, bool verbose=false);
     std::vector<std::string> m_strings;
     bool m_verbose;
+    bool contains(const std::string& str);
 private:
     static LLCallStackImpl *s_impl;
     S32 m_skipCount;
@@ -49,6 +50,7 @@ class LLContextStrings
     static void removeContextString(const std::string& str);
     static void output(std::ostream& os);
     static LLContextStrings* getThreadLocalInstance();
+    static bool contains(const std::string& str);
 private:
     std::map<std::string,S32> m_contextStrings;
 };
@@ -69,10 +71,10 @@ class LLScopedContextString
     std::string m_str;
 };
 
-// This doesn't really have any state, just acts as class to hook the
-// ostream override to.
+// Mostly exists as a class to hook an ostream override to.
 struct LLContextStatus
 {
+    bool contains(const std::string& str);
 };
 
 LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLContextStatus& context_status);
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 3f32be1d68aae289a89fbcf4cbc57b1282db551c..0393f416667372636164b0e793e847d226bfee36 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -4137,6 +4137,8 @@ void LLAgent::setTeleportState(ETeleportState state)
 
 void LLAgent::stopCurrentAnimations()
 {
+    LL_DEBUGS("Avatar") << "Stopping current animations" << LL_ENDL;
+
 	// This function stops all current overriding animations on this
 	// avatar, propagating this change back to the server.
 	if (isAgentAvatarValid())
@@ -4154,6 +4156,7 @@ void LLAgent::stopCurrentAnimations()
 				// don't cancel a ground-sit anim, as viewers
 				// use this animation's status in
 				// determining whether we're sitting. ick.
+                LL_DEBUGS("Avatar") << "sit or do-not-disturb animation will not be stopped" << LL_ENDL;
 			}
 			else
 			{
@@ -4183,8 +4186,7 @@ void LLAgent::stopCurrentAnimations()
 
 		// re-assert at least the default standing animation, because
 		// viewers get confused by avs with no associated anims.
-		sendAnimationRequest(ANIM_AGENT_STAND,
-				     ANIM_REQUEST_START);
+		sendAnimationRequest(ANIM_AGENT_STAND, ANIM_REQUEST_START);
 	}
 }
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index bbd7183dd204b026a81e4a6c726872eb734f99ae..fefbcabb2be202ed7b5aa3151202b5d6ecab88b9 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -6031,6 +6031,18 @@ class LLAvatarToggleMyProfile : public view_listener_t
 	}
 };
 
+class LLAvatarResetSkeleton: public view_listener_t
+{
+    bool handleEvent(const LLSD& userdata)
+    {
+		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
+		if(avatar)
+        {
+            avatar->resetSkeleton();
+        }
+        return true;
+    }
+};
 
 class LLAvatarAddContact : public view_listener_t
 {
@@ -9017,6 +9029,7 @@ void initialize_menus()
 	enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall));
 	view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse");
 	view_listener_t::addMenu(new LLAvatarToggleMyProfile(), "Avatar.ToggleMyProfile");
+	view_listener_t::addMenu(new LLAvatarResetSkeleton(), "Avatar.ResetSkeleton");
 	enable.add("Avatar.IsMyProfileOpen", boost::bind(&my_profile_visible));
 
 	commit.add("Avatar.OpenMarketplace", boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL")));
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index a8cc797f1638835709981d539a85d403356ae8ea..204432dc166cffc2b1ae522397ad19f208b42199 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1801,6 +1801,13 @@ void LLVOAvatar::buildCharacter()
 	mMeshValid = TRUE;
 }
 
+//-----------------------------------------------------------------------------
+// resetSkeleton()
+//-----------------------------------------------------------------------------
+void LLVOAvatar::resetSkeleton()
+{
+    LL_DEBUGS("Avatar") << avString() << LL_ENDL;
+}
 
 //-----------------------------------------------------------------------------
 // releaseMeshData()
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index e1b4885bbb4279feb812b755e4d1824e1bb5702f..76b40fb90a490dd50e62b2e8f0402596a8dcb57a 100755
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -364,6 +364,7 @@ class LLVOAvatar :
 
 	/*virtual*/ BOOL	loadSkeletonNode();
 	/*virtual*/ void	buildCharacter();
+    void				resetSkeleton();
 
 	LLVector3			mCurRootToHeadOffset;
 	LLVector3			mTargetRootToHeadOffset;
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
index ba91b0b5d9489a7aa9fcb1e55bdcd87b58cf57f8..c3c6701d01b5263e21c36283a0129efc074f4045 100755
--- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
@@ -39,6 +39,15 @@
       <menu_item_call.on_click
          function="Avatar.InviteToGroup" />
       </menu_item_call>
+   <menu_item_separator />
+
+     <menu_item_call label="Reset Skeleton"
+       layout="topleft"
+       name="Reset Skeleton">
+       <menu_item_call.on_click
+        function="Avatar.ResetSkeleton" />
+     </menu_item_call>
+
    <menu_item_separator />
     <menu_item_call
      enabled="false"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index c6ae844d676dc6385f8181134975fd69f924cce0..ced0dd37b161bce848af23c46839cd3a7e881543 100755
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -99,6 +99,13 @@ name="Edit Outfit">
      <menu_item_call.on_enable
       function="Edit.EnableHoverHeight" />
   </menu_item_call>
+  <menu_item_call label="Reset Skeleton"
+       layout="topleft"
+       name="Reset Skeleton">
+       <menu_item_call.on_click
+        function="Avatar.ResetSkeleton" />
+  </menu_item_call>
+
   <menu_item_call
     label="My Friends"
     layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
index cfbbe41f95473e7d709c5dad7f57e0c869d1ef2e..f04a70d0a54a9c945c921e7fb937b8c3419e01ea 100755
--- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
@@ -40,6 +40,15 @@
          function="Avatar.InviteToGroup" />
       </menu_item_call>
     
+   <menu_item_separator />
+
+     <menu_item_call label="Reset Skeleton"
+       layout="topleft"
+       name="Reset Skeleton">
+       <menu_item_call.on_click
+        function="Avatar.ResetSkeleton" />
+     </menu_item_call>
+
    <menu_item_separator />
    
      <menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index d3b0b07f700f461fc7c55619de2443b61a9bcfb9..924e8b8454575e6233ab40f274a770c2f2ba17f9 100755
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -237,6 +237,12 @@
      <menu_item_call.on_enable
       function="Edit.EnableHoverHeight" />
    </menu_item_call>
+   <menu_item_call label="Reset Skeleton"
+     layout="topleft"
+     name="Reset Skeleton">
+     <menu_item_call.on_click
+      function="Avatar.ResetSkeleton" />
+   </menu_item_call>
    <menu_item_call
      label="My Friends"
      layout="topleft"