change join* implementation