optimize times by storing replacements as strings
heavily optimize the already-skeleton case by turning step 2 in a no-op