diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index 5329b76390ec691a57e97ca9b71fc4e39971c22f..ae57e125bb74c39564937609e95c20c1cd412b47 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -51,7 +51,7 @@
 					<key>tags</key>
 						<array>
 						<!-- sample entry for debugging specific items	
-                             <string>AXON</string>
+                             <string>AnimatedObjects</string>
 						     <string>Avatar</string>
 						     <string>Inventory</string>
 						     <string>SceneLoadTiming</string>
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 7e89a97c03a327616dbf097a74151786d3089cb0..920b0fa151e962db2db184cd8c37e76e487403dc 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -52,7 +52,7 @@ LLControlAvatar::~LLControlAvatar()
 // virtual
 void LLControlAvatar::initInstance()
 {
-	// AXON - potential optimizations here: avoid creating system
+	// Potential optimizations here: avoid creating system
 	// avatar mesh content since it's not used. For now we just clean some
 	// things up after the fact in releaseMeshData().
     LLVOAvatar::initInstance();
@@ -280,10 +280,11 @@ void LLControlAvatar::updateDebugText()
                 type_string += "-";
             }
         }
-        addDebugText(llformat("CAV obj %d anim %d active %s",
-                              total_linkset_count, animated_volume_count, active_string.c_str()));
+        addDebugText(llformat("CAV obj %d anim %d active %s impost %d",
+                              total_linkset_count, animated_volume_count, active_string.c_str(), (S32) isImpostor()));
         addDebugText(llformat("types %s lods %s", type_string.c_str(), lod_string.c_str()));
         addDebugText(llformat("tris %d verts %d", total_tris, total_verts));
+        addDebugText(llformat("pxarea %s", LLStringOps::getReadableNumber(getPixelArea()).c_str()));
         std::string region_name = "no region";
         if (mRootVolp->getRegion())
         {
@@ -335,7 +336,7 @@ void LLControlAvatar::updateAnimations()
 {
     if (!mRootVolp)
     {
-        LL_WARNS_ONCE("AXON") << "No root vol" << LL_ENDL;
+        LL_WARNS_ONCE("AnimatedObjects") << "No root vol" << LL_ENDL;
         return;
     }
 
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 8f2cf5bb89c05dcebb41d2c0dc518e9bd23479d3..cd00a6f98fa6c8a176ee5b1bdfe0f70fa1044004 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -347,9 +347,14 @@ void LLPanelObject::getState( )
     // 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"));
-	BOOL enable_scale	= objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && objectp->permModify();
-	BOOL enable_rotate	= objectp->permMove() && !objectp->isPermanentEnforced() && ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && ((objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
+	BOOL enable_move	= objectp->permMove() && !objectp->isPermanentEnforced() &&
+        ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) &&
+        ((objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
+	BOOL enable_scale	= objectp->permMove() && !objectp->isPermanentEnforced() &&
+        ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) && objectp->permModify();
+	BOOL enable_rotate	= objectp->permMove() && !objectp->isPermanentEnforced() &&
+        ((root_objectp == NULL) || !root_objectp->isPermanentEnforced()) &&
+        ((objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
 
 	S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
 	BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 24af491391cb6b511defd65cadb96a86195a8d0b..bfaad30fc1f39a118cda92593a082c7e3b7f695b 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5086,32 +5086,32 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
     LLViewerObject *objp = gObjectList.findObject(uuid);
     if (!objp)
     {
-		LL_WARNS("Messaging") << "AXON Received animation state for unknown object" << uuid << LL_ENDL;
+		LL_WARNS("Messaging") << "Received animation state for unknown object" << uuid << LL_ENDL;
         return;
     }
     
 	LLVOVolume *volp = dynamic_cast<LLVOVolume*>(objp);
     if (!volp)
     {
-		LL_WARNS("Messaging") << "AXON Received animation state for non-volume object" << uuid << LL_ENDL;
+		LL_WARNS("Messaging") << "Received animation state for non-volume object" << uuid << LL_ENDL;
         return;
     }
 
     if (!volp->isAnimatedObject())
     {
-		LL_WARNS("Messaging") << "AXON Received animation state for non-animated object" << uuid << LL_ENDL;
+		LL_WARNS("Messaging") << "Received animation state for non-animated object" << uuid << LL_ENDL;
         return;
     }
 
     LLControlAvatar *avatarp = volp->getControlAvatar();
     if (!avatarp)
     {
-        LL_WARNS("Messaging") << "AXON no control avatar, ignoring" << LL_ENDL;
+        LL_WARNS("Messaging") << "Received animation request for object with no control avatar, ignoring" << LL_ENDL;
         return;
     }
     
 	S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationList);
-	LL_DEBUGS("AXON") << "processing object animation requests, num_blocks " << num_blocks << LL_ENDL;
+	LL_DEBUGS("AnimatedObjects") << "processing object animation requests, num_blocks " << num_blocks << LL_ENDL;
 
 #if 1 
     // Here we go into skinned mode once, the first time we get an
@@ -5156,8 +5156,8 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
         mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i);
         mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i);
         volp->mObjectSignaledAnimations[animation_id] = anim_sequence_id;
-        LL_DEBUGS("AXON") << "got object animation request for object " 
-                          << uuid << " animation id " << animation_id << LL_ENDL;
+        LL_DEBUGS("AnimatedObjects") << "got object animation request for object " 
+                                     << uuid << " animation id " << animation_id << LL_ENDL;
     }
 
     avatarp->updateAnimations();
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index bc5cca4a65ae050bedb647eb2d512a4d1494d769..a91e9ff53d7142e66b7a7df7a02e1be4856b8c99 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3461,6 +3461,10 @@ void LLVOAvatar::updateDebugText()
         LLVector3 pelvis_pos = mPelvisp->getPosition();
         debug_line += llformat(" rp %.3f pp %.3f", root_pos[2], pelvis_pos[2]);
 
+        S32 is_visible = (S32) isVisible();
+        S32 is_m_visible = (S32) mVisible;
+        debug_line += llformat(" v %d/%d", is_visible, is_m_visible);
+
 		addDebugText(debug_line);
 	}
 
@@ -3681,7 +3685,7 @@ void LLVOAvatar::computeUpdatePeriod()
 	if (mDrawable.notNull()
         && isVisible() 
         && (!isSelf() || visually_muted)
-        && !mIsDummy
+        && (!mIsDummy || isControlAvatar())
         && sUseImpostors
         && !mNeedsAnimUpdate 
         && !sFreezeCounter)
@@ -3900,7 +3904,7 @@ 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
+        // 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);
@@ -6162,7 +6166,7 @@ F32 LLVOAvatar::getTimeDilation()
 F32 LLVOAvatar::getPixelArea() const
 {
     // AXON UPDATE FOR CONTROL AVATARS
-	if (mIsDummy)
+	if (mIsDummy && !isControlAvatar())
 	{
 		return 100000.f;
 	}
@@ -7138,9 +7142,14 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color)
 	updateMeshTextures();
 }
 
+// FIXME: We have an mVisible member, set in updateVisibility(), but this
+// function doesn't return it! isVisible() and mVisible are used
+// different places for different purposes. mVisible seems to be more
+// related to whether the actual avatar mesh is shown, and isVisible()
+// to whether anything about the avatar is displayed in the scene.
+// Maybe better naming could make this clearer?
 BOOL LLVOAvatar::isVisible() const
 {
-    // AXON should we flag control avs as invisible?
 	return mDrawable.notNull()
 		&& (!mOrphaned || isSelf())
 		&& (mDrawable->isVisible() || mIsDummy);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index fbbf0634ff27cd617fc4ee3647eeeee6b642df66..8c722bf1060ae800af4a07af7e1ae09539918b83 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1354,7 +1354,7 @@ BOOL LLVOVolume::updateLOD()
         {
             std::string vobj_name = llformat("Vol%u", (U32) this);
             F32 est_tris = getEstTrianglesMax();
-            LL_DEBUGS("AXONLinkset") << vobj_name << " updateLOD to " << getLOD() << ", tris " << est_tris << LL_ENDL; 
+            LL_DEBUGS("AnimatedObjectsLinkset") << vobj_name << " updateLOD to " << getLOD() << ", tris " << est_tris << LL_ENDL; 
         }
 #endif
 		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
@@ -3396,10 +3396,10 @@ void LLVOVolume::setExtendedMeshFlags(U32 flags)
             param_block->setFlags(flags);
         }
         parameterChanged(LLNetworkData::PARAMS_EXTENDED_MESH, true);
-        LL_DEBUGS("AXON") << (U32) this
-                   << " new flags " << flags << " curr_flags " << curr_flags
-                   << ", calling onSetExtendedMeshFlags()"
-                   << LL_ENDL;
+        LL_DEBUGS("AnimatedObjects") << (U32) this
+                                     << " new flags " << flags << " curr_flags " << curr_flags
+                                     << ", calling onSetExtendedMeshFlags()"
+                                     << LL_ENDL;
         onSetExtendedMeshFlags(flags);
     }
 }
@@ -3440,13 +3440,12 @@ void LLVOVolume::updateAnimatedObjectStateOnReparent(LLViewerObject *old_parent,
 {
     LLVOVolume *old_volp = dynamic_cast<LLVOVolume*>(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 (mControlAvatar.notNull())
         {
+            // Here an animated object is being made the child of some
+            // other prim. Should remove the control av from the child.
             LLControlAvatar *av = mControlAvatar;
             mControlAvatar = NULL;
             av->markForDeath();
@@ -3925,17 +3924,14 @@ void LLVOVolume::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_u
     {
         U32 extended_mesh_flags = getExtendedMeshFlags();
         bool enabled =  (extended_mesh_flags & LLExtendedMeshParams::ANIMATED_MESH_ENABLED_FLAG);
-        // AXON This is kind of a guess. Better if we could compare
-        // the before and after flags directly. What about cases where
-        // there's no control avatar for optimization reasons?
         bool was_enabled = (getControlAvatar() != NULL);
         if (enabled != was_enabled)
         {
-            LL_DEBUGS("AXON") << (U32) this
-                              << " calling onSetExtendedMeshFlags, enabled " << (U32) enabled
-                              << " was_enabled " << (U32) was_enabled
-                              << " local_origin " << (U32) local_origin
-                              << LL_ENDL;
+            LL_DEBUGS("AnimatedObjects") << (U32) this
+                                         << " calling onSetExtendedMeshFlags, enabled " << (U32) enabled
+                                         << " was_enabled " << (U32) was_enabled
+                                         << " local_origin " << (U32) local_origin
+                                         << LL_ENDL;
             onSetExtendedMeshFlags(extended_mesh_flags);
         }
     }
@@ -4080,7 +4076,7 @@ void LLVOVolume::markForUpdate(BOOL priority)
     {
         std::string vobj_name = llformat("Vol%u", (U32) this);
         F32 est_tris = getEstTrianglesMax();
-        LL_DEBUGS("AXONLinkset") << vobj_name << " markForUpdate, tris " << est_tris << LL_ENDL; 
+        LL_DEBUGS("AnimatedObjectsLinkset") << vobj_name << " markForUpdate, tris " << est_tris << LL_ENDL; 
     }
 #endif
     LLViewerObject::markForUpdate(priority); 
@@ -5028,15 +5024,15 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
             F32 est_tris = vobj->getEstTrianglesMax();
 
 #if 1
-            LL_DEBUGS("AXONLinkset") << vobj_name << " rebuilding, isAttachment: " << (U32) vobj->isAttachment()
-                              << " is_mesh " << is_mesh
-                              << " est_tris " << est_tris
-                              << " is_animated " << vobj->isAnimatedObject()
-                              << " can_animate " << vobj->canBeAnimatedObject() 
-                              << " cav " << vobj->getControlAvatar() 
-                              << " playing " << (U32) (vobj->getControlAvatar() ? vobj->getControlAvatar()->mPlaying : false)
-                              << " frame " << LLFrameTimer::getFrameCount()
-                              << LL_ENDL;
+            LL_DEBUGS("AnimatedObjectsLinkset") << vobj_name << " rebuilding, isAttachment: " << (U32) vobj->isAttachment()
+                                                << " is_mesh " << is_mesh
+                                                << " est_tris " << est_tris
+                                                << " is_animated " << vobj->isAnimatedObject()
+                                                << " can_animate " << vobj->canBeAnimatedObject() 
+                                                << " cav " << vobj->getControlAvatar() 
+                                                << " playing " << (U32) (vobj->getControlAvatar() ? vobj->getControlAvatar()->mPlaying : false)
+                                                << " frame " << LLFrameTimer::getFrameCount()
+                                                << LL_ENDL;
 #endif
 
 			llassert_always(vobj);
@@ -5059,11 +5055,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
                     F32 tri_count = vobj->getRootEdit()->recursiveGetEstTrianglesMax();
                     if (tri_count <= 0.f)
                     {
-                        LL_DEBUGS("AXON") << vobj_name << " not calling linkControlAvatar(), because no tris" << LL_ENDL;
+                        LL_DEBUGS("AnimatedObjects") << vobj_name << " not calling linkControlAvatar(), because no tris" << LL_ENDL;
                     }
                     else
                     {
-                        LL_DEBUGS("AXON") << vobj_name << " calling linkControlAvatar()" << LL_ENDL;
+                        LL_DEBUGS("AnimatedObjects") << vobj_name << " calling linkControlAvatar()" << LL_ENDL;
                         vobj->linkControlAvatar();
                     }
                 }
@@ -5079,7 +5075,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
                 // the checkbox has changed since the last rebuild.
                 if (vobj->getControlAvatar())
                 {
-                    LL_DEBUGS("AXON") << vobj_name << " calling unlinkControlAvatar()" << LL_ENDL;
+                    LL_DEBUGS("AnimatedObjects") << vobj_name << " calling unlinkControlAvatar()" << LL_ENDL;
                     vobj->unlinkControlAvatar();
                 }
             }
@@ -5583,7 +5579,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
                 {
                     std::string vobj_name = llformat("Vol%u", (U32) vobj);
                     F32 est_tris = vobj->getEstTrianglesMax();
-                    LL_DEBUGS("AXONLinkset") << vobj_name << " rebuildMesh, tris " << est_tris << LL_ENDL; 
+                    LL_DEBUGS("AnimatedObjectsLinkset") << vobj_name << " rebuildMesh, tris " << est_tris << LL_ENDL; 
         }
 #endif
 				vobj->preRebuild();
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 900c749ee0acab4e200b0efd27d3c2d217d06aba..6be5db8246d93d1b75cb92684d02f90c08e96ea2 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -3357,8 +3357,8 @@ void LLPipeline::markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags f
         {
             std::string vobj_name = llformat("Vol%u", (U32) vol_obj);
             F32 est_tris = vol_obj->getEstTrianglesMax();
-            LL_DEBUGS("AXONLinkset") << vobj_name << " markRebuild, tris " << est_tris 
-                                     << " priority " << (S32) priority << " flag " << std::hex << flag << LL_ENDL; 
+            LL_DEBUGS("AnimatedObjectsLinkset") << vobj_name << " markRebuild, tris " << est_tris 
+                                                << " priority " << (S32) priority << " flag " << std::hex << flag << LL_ENDL; 
         }
 #endif