More work, everything should theoretically work now, untested