core: use cleaner UI abstractions