almost finished, except map