engine now calls state update directly