fixes + overhaul mainloop