refact #3
refact #5
enhanc #6