much cleaner object oriented style
change and * events added