What you're suggesting 'kinda' makes sense.  Except for one thing:  as of now, I expect that preHotDeploy and postHotDeploy are really functions directly related to publish().   A publish subsystem knows if it needs to take specific pre-or-post-hotdeploy actions. 

So right now we have only 1 main publish subsystem. It's for transfering files (local or remote).  This one needs to start or stop the deployment scanners. 

I fully expect that our management deployer will not need to take any such actions. And any domain-mode deployment we come up with also will probably not need this, since a server in domain mode will be using management api for deployment as well. 

Therefore, things like preHotDeploy and postHotDeploy are actually not functions of the server type, but functions of how its being published + the server type. Therefore, those actions belong in the publish subsystem. 

And we basically do have this already. We have 2 publish systems (I know I said 1, but we have 2. One is for deploy-only server). StandardFileSystemPublishController and SuspendedScannersFileSystemPublishController . The only difference between them?  publishStart() and publishFinish() are overridden to suspend or resume the deployment scanners. 

Again, I would consider moving this logic *IF* I actually believed other methods of publishing would require these calls. But, management API deployment does not and never will require suspension of deployment scanners (as far as I can see) and so this logic is really not universal for all preHotDeploy or postHotDeploy workflows, and I believe it would be very wrong to put it there. If we did as you suggest,  then publish workflows that do not require suspension of deployment scanners would be suspending them all the time unnecessarily. 

But your comment here is out of place, anyway, since this specific comment chain is about removing deployment scanners on server stop. Legacy AS automatically remove them. AS 7 or higher persist them in the standalone.xml, and thus they must be explicitly removed.