many changes too lazy to document