* SOLVED
The answer occurred to me right after posting. When the rule conforms to the expression at level 1, replace does not know I meant it to be done at level 2. So it did the replace at level 1. The solution is to use Replace[expression,rule,2]