use factory + improve UI