completely reimplement loads of things