client side (mostly done)