Fixed: update UI on main thread