added a lot of cool functionality