add GPL
complete re-write and add GPL