add Factory method plus some corrects