better add source function