Thanks for your patience: at last I understand! We need to shoot the chicken or break the egg. :-)

What I mean is that property resolution should not be happening under the PlanBridge, which only needs to extract the name and version from a plan file. Therefore, in retrospect (since properties were, I think, added relatively late in the day), reusing PlanReader was a mistake.

A common helper class, called something like PlanIdentityParser, should be factored out of PlanReader. PlanIdentityParser should be responsible for extracting the name and version from a plan file. PlanReader and PlanBridge can use PlanIdentityParser. Then PlanBridge won't try to resolve property placeholders.