Adding comments, change some protected to private

Look yourself