First version, basic implementaions