fully generalizing change location functionality