fully generalized change location functionality