diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 848a8b0d40449e10b2408d2b12e16c558775d4b2..afa6be188dc397123644c1c8b63654057190f23c 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -49,6 +49,13 @@ LLControlAvatar::~LLControlAvatar()
 {
 }
 
+// virtual
+void LLControlAvatar::initInstance()
+{
+	// AXON - potential optimizations here - avoid creating system avatar mesh since it's not used.
+    LLVOAvatar::initInstance();
+}
+
 void LLControlAvatar::matchVolumeTransform()
 {
     if (mRootVolp)
@@ -173,7 +180,6 @@ void LLControlAvatar::updateVolumeGeom()
 
 LLControlAvatar *LLControlAvatar::createControlAvatar(LLVOVolume *obj)
 {
-    // AXON Lifted from LLPreviewAnimation
 	LLControlAvatar *cav = (LLControlAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion(), CO_FLAG_CONTROL_AVATAR);
 
     cav->mRootVolp = obj;
diff --git a/indra/newview/llcontrolavatar.h b/indra/newview/llcontrolavatar.h
index 308d43161516ab9d0733c185221f5472a14d3643..a0f7912d240b34f67def04995c2650d3cc73c2e4 100644
--- a/indra/newview/llcontrolavatar.h
+++ b/indra/newview/llcontrolavatar.h
@@ -37,6 +37,7 @@ class LLControlAvatar:
 
 public:
     LLControlAvatar(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
+	virtual void 			initInstance(); // Called after construction to initialize the class.
 	virtual	~LLControlAvatar();
 
     void matchVolumeTransform();
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 30560eeb7bcf3e53e1218538feff1e2fd51a4e02..206d4f4c7a050bffbf7747b30fc2a77e6a58f6d9 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -467,7 +467,6 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
 	}
 	LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
 
-// AXON fix
 	if (avatarp->isDead() || (avatarp->mIsDummy && !avatarp->isControlAvatar()) || avatarp->mDrawable.isNull())
 	{
 		return;
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 43d6245a63b494e125147458a0320a3f59b3be6f..8f2cf5bb89c05dcebb41d2c0dc518e9bd23479d3 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -343,7 +343,8 @@ void LLPanelObject::getState( )
 
 	// can move or rotate only linked group with move permissions, or sub-object with move and modify perms
 
-    // AXON it's not entirely clear what the motivation is to have 3
+    // AXON REVIEW BEFORE RELEASE, behavior during edit is glitchy.
+    // it's not entirely clear what the motivation is to have 3
     // different rules for enablement. At least the difference between
     // move and rotate looks like just a parens error, have updated accordingly.
 	BOOL enable_move	= objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && ((objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 6a71da3918f08b3bf6ef9e06fd0c4ac39d294d47..5c4c430f83c8e527061a43fb554d27aacb5093ba 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -361,9 +361,6 @@ void LLPanelVolume::getState( )
     // Animated Mesh
 	BOOL is_animated_mesh = single_root_volume && root_volobjp && root_volobjp->isAnimatedObject();
 	getChild<LLUICtrl>("Animated Mesh Checkbox Ctrl")->setValue(is_animated_mesh);
-    // AXON FIXME CHECK FOR SKIN INFO ALSO
-    // WHAT ABOUT isPermanentEnforced?
-    // What about linksets with some skinned objects?
     BOOL enabled_animated_object_box = FALSE;
     if (root_volobjp && root_volobjp == volobjp)
     {
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index f666f447cb8341a5e7f44a267c02c6aaaa27caac..473d7e5b5f373a985035e0262f4352758ab00ac6 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -664,9 +664,9 @@ void LLSelectMgr::confirmUnlinkObjects(const LLSD& notification, const LLSD& res
 // the selection and give an error message when the uer has a
 // reasonable expectation for the link to work, but it will fail.
 //
-// AXON - additional check that if the selection includes at least one
-// animated object, the total mesh triangle count cannot exceed the
-// designated limit.
+// For animated objects, there's additional check that if the
+// selection includes at least one animated object, the total mesh
+// triangle count cannot exceed the designated limit.
 bool LLSelectMgr::enableLinkObjects()
 {
 	bool new_value = false;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 0b2931886a99bf67c27e20e229696b126edc496c..7260d7f928e1fa277d60342194489ca117a7a9bd 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5106,7 +5106,7 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
     LLControlAvatar *avatarp = volp->getControlAvatar();
     if (!avatarp)
     {
-        LL_WARNS() << "AXON no control avatar, ignoring" << LL_ENDL;
+        LL_WARNS("Messaging") << "AXON no control avatar, ignoring" << LL_ENDL;
         return;
     }
     
@@ -5120,17 +5120,19 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
     if (!avatarp->mPlaying)
     {
         avatarp->mPlaying = true;
-		avatarp->updateVolumeGeom();
-        avatarp->mRootVolp->recursiveMarkForUpdate(TRUE);
+        if (!avatarp->mRootVolp->isAnySelected())
+        {
+            avatarp->updateVolumeGeom();
+            avatarp->mRootVolp->recursiveMarkForUpdate(TRUE);
+        }
     }
 #else
-    // AXON
+    // AXON REMOVE BEFORE RELEASE?
     // In this block we switch back into static mode when no animations are
     // playing. This is mostly useful for debugging.
     if (num_blocks > 0 && !avatarp->mPlaying)
     {
         avatarp->mPlaying = true;
-        // AXON need to update all objects in the linkset, not just the one where animation is playing
         if (!avatarp->mRootVolp->isAnySelected())
         {
             avatarp->updateVolumeGeom();
@@ -5140,7 +5142,6 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
     else if (num_blocks == 0 && avatarp->mPlaying)
     {
         avatarp->mPlaying = false;
-        // AXON need to update all objects in the linkset, not just the one where animation is playing
         if (!avatarp->mRootVolp->isAnySelected())
         {
             avatarp->updateVolumeGeom();
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 3435217fa48500a791d717e84b59d2c349c8f8d3..7d370aff35aacdf8da2ff76de29c1633cfe180ee 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -3609,7 +3609,7 @@ F32 LLViewerObject::recursiveGetEstTrianglesMax() const
 S32 LLViewerObject::getAnimatedObjectMaxTris() const
 {
     S32 max_tris = 0;
-    // AXON remove after server testing done
+    // AXON REMOVE AFTER SERVER TESTING DONE
     if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits"))
     {
         max_tris = S32_MAX;
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index cdbe87de750b542b8e4836e2538efe080546281f..ea7214d937306d9c8268aab1d61f80bc5b9f2181 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1108,7 +1108,7 @@ void LLVOAvatar::cleanupClass()
 }
 
 // virtual
-void LLVOAvatar::initInstance(void)
+void LLVOAvatar::initInstance()
 {
 	//-------------------------------------------------------------------------
 	// register motions
@@ -3470,7 +3470,7 @@ void LLVOAvatar::updateDebugText()
                         LLVOVolume *volp = control_av->mRootVolp;
                         if (volp)
                         {
-                            volp->requestInventory(); // AXON should be a no-op if already requested or fetched?
+                            volp->requestInventory(); 
                             LLViewerInventoryItem* item = volp->getInventoryItemByAsset(motionp->getID());
                             if (item)
                             {
@@ -3658,10 +3658,9 @@ void LLVOAvatar::updateFootstepSounds()
 void LLVOAvatar::computeUpdatePeriod()
 {
 	bool visually_muted = isVisuallyMuted();
-    // AXON FIXME this expression is a crawling horror
 	if (mDrawable.notNull()
         && isVisible() 
-        && (!isSelf() || visually_muted) // AXON would the self ever be visually muted?
+        && (!isSelf() || visually_muted)
         && !mIsDummy
         && sUseImpostors
         && !mNeedsAnimUpdate 
@@ -3881,7 +3880,8 @@ void LLVOAvatar::updateTimeStep()
     bool is_pure_dummy = mIsDummy && !isControlAvatar();
 	if (!isSelf() && !is_pure_dummy) // ie, non-self avatars, and animated objects will be affected.
 	{
-        // AXON note that sInstances counts animated objects and standard avatars in the same bucket. Is this desirable?
+        // AXON note that sInstances counts animated objects and
+        // standard avatars in the same bucket. Is this desirable?
 		F32 time_quantum = clamp_rescale((F32)sInstances.size(), 10.f, 35.f, 0.f, 0.25f);
 		F32 pixel_area_scale = clamp_rescale(mPixelArea, 100, 5000, 1.f, 0.f);
 		F32 time_step = time_quantum * pixel_area_scale;
@@ -3999,7 +3999,9 @@ void LLVOAvatar::updateRootPositionAndRotation(LLAgent& agent, F32 speed, bool w
 		//--------------------------------------------------------------------
 		if (!isControlAvatar() && !isAnyAnimationSignaled(AGENT_NO_ROTATE_ANIMS, NUM_AGENT_NO_ROTATE_ANIMS))
 		{
-            // AXON - should we always skip for control avatars? Rotation fixups for avatars in motion, some may be relevant.
+            // AXON - should we always skip for control avatars?
+            // Rotation fixups for avatars in motion, some may be
+            // relevant.
             updateOrientation(agent, speed, delta_time);
 		}
 	}
@@ -5999,7 +6001,6 @@ void LLVOAvatar::showAttachmentOverrides(bool verbose) const
 //-----------------------------------------------------------------------------
 // removeAttachmentOverridesForObject
 //-----------------------------------------------------------------------------
-// AXON handle NPC case
 void LLVOAvatar::removeAttachmentOverridesForObject(LLViewerObject *vo)
 {
     if (vo->getAvatar() != this && vo->getAvatarAncestor() != this)
@@ -6028,7 +6029,6 @@ void LLVOAvatar::removeAttachmentOverridesForObject(LLViewerObject *vo)
 //-----------------------------------------------------------------------------
 // removeAttachmentOverridesForObject
 //-----------------------------------------------------------------------------
-// AXON handle NPC case
 void LLVOAvatar::removeAttachmentOverridesForObject(const LLUUID& mesh_id)
 {	
 	//Subsequent joints are relative to pelvis
@@ -6107,7 +6107,7 @@ void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_age
 	LLVector3d z_vec(0.0f, 0.0f, 1.0f);
 	LLVector3d p0_global, p1_global;
 
-    // AXON update for control avs?
+    // AXON UPDATE FOR CONTROL AVS?
 	if (mIsDummy)
 	{
 		outNorm.setVec(z_vec);
@@ -6137,7 +6137,7 @@ F32 LLVOAvatar::getTimeDilation()
 //-----------------------------------------------------------------------------
 F32 LLVOAvatar::getPixelArea() const
 {
-    // AXON update for control avatars
+    // AXON UPDATE FOR CONTROL AVATARS
 	if (mIsDummy)
 	{
 		return 100000.f;
@@ -6675,7 +6675,7 @@ U32 LLVOAvatar::getNumAnimatedObjectAttachments() const
 S32 LLVOAvatar::getMaxAnimatedObjectAttachments() const
 {
     S32 max_attach = 0;
-    // AXON remove after server testing done
+    // AXON REMOVE AFTER SERVER TESTING DONE
     if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits"))
     {
         max_attach = MAX_AGENT_ATTACHMENTS;
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index 337f969f3d0881b8baf0f863434543ecefd2e84e..5def0f0c0fd303ec03653e078cf77424cf409b2b 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -92,7 +92,6 @@ LLVOGrass::~LLVOGrass()
 
 void LLVOGrass::updateSpecies()
 {
-	// AXON is grass still even supported? This use of state seems odd.
 	mSpecies = getAttachmentState();
 	
 	if (!sSpeciesTable.count(mSpecies))
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 54029f75fdf84555f6d5cbf26560d41854b7f796..96f2255265b4f2e3bbec92e4ea4ff076066faffd 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -91,7 +91,6 @@ U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG = 1;
 BOOL gAnimateTextures = TRUE;
 //extern BOOL gHideSelectedObjects;
 
-// AXON TEMP
 S32 LLVOVolume::sForceLOD = -1;
 F32 LLVOVolume::sLODFactor = 1.f;
 F32	LLVOVolume::sLODSlopDistanceFactor = 0.5f; //Changing this to zero, effectively disables the LOD transition slop 
@@ -1234,7 +1233,7 @@ void LLVOVolume::sculpt()
 S32	LLVOVolume::computeLODDetail(F32 distance, F32 radius)
 {
 	S32	cur_detail;
-    // AXON TEMP
+    // AXON TEMP REMOVE
     if (LLVOVolume::sForceLOD>=0 && LLVOVolume::sForceLOD<=3)
     {
         cur_detail = LLVOVolume::sForceLOD;
@@ -3341,8 +3340,6 @@ BOOL LLVOVolume::isRiggedMesh() const
 }
 
 //----------------------------------------------------------------------------
-// AXON - methods related to extended mesh flags
-
 U32 LLVOVolume::getExtendedMeshFlags() const
 {
 	const LLExtendedMeshParams *param_block = 
@@ -3412,7 +3409,6 @@ bool LLVOVolume::canBeAnimatedObject() const
     F32 est_tris = recursiveGetEstTrianglesMax();
     if (est_tris < 0 || est_tris > getAnimatedObjectMaxTris())
     {
-        LL_DEBUGS("AXON") << "est_tris " << est_tris << " is outside limit of 0-" << getAnimatedObjectMaxTris() << LL_ENDL;
         return false;
     }
     return true;
@@ -3441,6 +3437,8 @@ bool LLVOVolume::isAnimatedObject() const
 // Only the root of a linkset can have the animated object flag set
 // Only the root of a linkset can have a control avatar (iff the animated object flag is set)
 // Only skinned mesh volumes can have the animated object flag set, or a control avatar
+//
+// AXON REVIEW BASED ON FINAL RULES
 bool LLVOVolume::isAnimatedObjectStateConsistent() const
 {
     if (!canBeAnimatedObject())
@@ -3486,16 +3484,9 @@ void LLVOVolume::updateAnimatedObjectStateOnReparent(LLViewerObject *old_parent,
 
     // AXON - depending on whether animated objects can be attached,
     // we may want to include or remove the isAvatar() check.
+    // BUG??
     if (new_parent && !new_parent->isAvatar())
     {
-#if 0 // AXON - MAINT-7819
-        // Object should inherit control avatar and animated mesh flag
-        // from parent, so clear them out from our own state
-        if (getExtendedMeshFlags() & LLExtendedMeshParams::ANIMATED_MESH_ENABLED_FLAG)
-        {
-            setExtendedMeshFlags(getExtendedMeshFlags() & ~LLExtendedMeshParams::ANIMATED_MESH_ENABLED_FLAG);
-        }
-#endif
         if (mControlAvatar.notNull())
         {
             LLControlAvatar *av = mControlAvatar;
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index f12eb168f6cc69702b39f7a907f60cb30d4459e2..afeb1c852b00adae73e88ce3ef88950acdb918c4 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -281,9 +281,6 @@ class LLVOVolume : public LLViewerObject
     bool isAnimatedObjectStateConsistent() const;
     void updateAnimatedObjectStateOnReparent(LLViewerObject *old_parent, LLViewerObject *new_parent);
 
-    // AXON For animated objects, we need to track animations requested
-    // per-object, then reconcile those to manage the control avatar
-    // animation state.
 	std::map<LLUUID, S32> 					mObjectSignaledAnimations; // requested state of Animation name/value
 
     // Functions that deal with media, or media navigation
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 436c0cbf432cf814d39f07ec0d3ac8b9fdb2efb5..bab81f42949ce3503eefdcdd9693213ef5a2342d 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -3352,7 +3352,6 @@ void LLPipeline::markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags f
 	{
 #if 1
         // AXON debugging
-        
         LLVOVolume *vol_obj = drawablep->getVOVolume();
         if (vol_obj && vol_obj->isAnimatedObject() && vol_obj->isRiggedMesh())
         {