add #15 fix #16 #17