add program model
refact