Added some documentation, please improve and reflect